SQL son tarihe göre satırları seçer


106

Aşağıdaki sorguyu ve sonuçları kullanarak, ChargeId ve ChargeType'ın benzersiz olduğu en yeni girişi arıyorum.

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

İstenilen:

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

Yanıtlar:


147

Öğeleri türe ve kimliğe göre gruplandırmak için GRUPLAMA BY kullanabilirsiniz . Ardından , en son hizmet ayını almak için MAX () Aggregate işlevini kullanabilirsiniz. Aşağıdaki, ChargeId, ChargeType ve MostRecentServiceMonth ile bir sonuç kümesi döndürür.

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE

1
Aşağı akışa ihtiyaç duymanız durumunda MAX (serviceMonth) alanını takma adı kullanmayı unutmayın.
Ben Hoffstein

2
Tamam, tabloda 1/1/2008 Nolu 101 N satırı varsa ne olur?
tvanfosson

3
fazladan bir satır döndürülürdü. Gereksinimlerine göre istenen sonuç budur.
Carlton Jenke

1
Postadaki sorguya takma ad eklendi. tvanfosson - bu, sonuç kümesine eklenen bir koşullu olacaktır, ki bu doğrudur.
Mitchel Sellers

1
Ayrıca kayıt kimliğini de çekmek istersem. Bunu nasıl yaparım?
Donny V.

58

Dolayısıyla, talepte bulunan kişinin istediği bu değil, "SQL'in en son tarihe göre satırları seçmesi" nin yanıtı.

Http://wiki.lessthandot.com/index.php/Returning_The_Maximum_Value_For_A_Row adresinden değiştirildi

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
Teşekkür ederim! Aradığım şey buydu!
Diana

Görüşlerle uyumlu görünmüyor.
nuzzolilo

11
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType

6

Geliştiricilerin çoğunun büyük veri üzerindeki etkisine bakmadan satır içi sorgu kullandığını görüyorum.

basitçe bunu şu şekilde başarabilirsiniz:

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

Yukarıdaki sorgu, farklı ücret kimliği farklı karakter türü kombinasyonlarına sahipse çalışacaktır.Umarım bu basit sorgu, çok az performans süresi dikkate alınarak yardımcı olur ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.