SQL memilih baris berdasarkan tanggal terbaru

106

Menggunakan kueri dan hasil berikut, saya mencari entri terbaru di mana ChargeId dan ChargeType unik.

select chargeId, chargeType, serviceMonth from invoice

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008
3   101     R       2/1/2008
4   101     R       3/1/2008
5   101     R       4/1/2008
6   101     R       5/1/2008
7   101     R       6/1/2008
8   101     R       7/1/2008

Diinginkan:

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008
jgreep
sumber

Jawaban:

147

Anda dapat menggunakan GROUP BY untuk mengelompokkan item menurut jenis dan id. Kemudian Anda dapat menggunakan fungsi MAX () Agregat untuk mendapatkan bulan layanan terbaru. Di bawah ini mengembalikan hasil yang ditetapkan dengan ChargeId, ChargeType, dan MostRecentServiceMonth

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE
Penjual Mitchel
sumber
1
Jangan lupa untuk membuat alias bidang MAX (serviceMonth) jika Anda membutuhkannya di hilir.
Ben Hoffstein
2
ok, jadi apa yang terjadi jika ada baris 101 N 1/1/2008 di tabel?
tvanfosson
3
Anda akan mendapatkan baris tambahan yang dikembalikan. Yang merupakan hasil yang diinginkan berdasarkan persyaratannya.
Carlton Jenke
1
Menambahkan alias ke kueri dalam postingan. tvanfosson - itu akan menjadi kondisi yang ditambahkan ke set hasil, yang benar.
Penjual Mitchel
1
Jika saya ingin juga menarik id rekaman dengannya. Bagaimana saya melakukannya?
Donny V.
58

Jadi ini bukan yang diminta pemohon, tetapi ini adalah jawaban untuk "SQL memilih baris menurut tanggal terbaru".

Dimodifikasi dari http://wiki.lessthandot.com/index.php/Returning_The_Maximum_Value_For_A_Row

SELECT t.chargeId, t.chargeType, t.serviceMonth FROM( 
    SELECT chargeId,MAX(serviceMonth) AS serviceMonth
    FROM invoice
    GROUP BY chargeId) x 
    JOIN invoice t ON x.chargeId =t.chargeId
    AND x.serviceMonth = t.serviceMonth
tvanfosson.dll
sumber
2
Terima kasih! Inilah yang saya cari!
Diana
Sepertinya tidak kompatibel dengan tampilan.
nuzzolilo
11
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType
Ben Hoffstein
sumber
6

Saya melihat sebagian besar pengembang menggunakan kueri sebaris tanpa melihat pengaruhnya pada data yang besar.

secara sederhana Anda dapat mencapai ini dengan:

select a.chargeId, a.chargeType, a.serviceMonth 
from invoice a
left outer join invoice b
on a.chargeId=b.chargeId and a.serviceMonth <b.serviceMonth 
where b.chargeId is null
order by a.serviceMonth desc
sujeet
sumber
1
select to.chargeid,t0.po,i.chargetype from invoice i
inner join
(select chargeid,max(servicemonth)po from invoice 
group by chargeid)t0
on i.chargeid=t0.chargeid

Kueri di atas akan berfungsi jika ID biaya yang berbeda memiliki kombinasi jenis target yang berbeda. Semoga kueri sederhana ini membantu dengan mempertimbangkan sedikit waktu kinerja ...

pari elanchezhiyan
sumber