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

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

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

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

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

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 ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.