SQL-Auswahl von Zeilen nach dem letzten Datum

106

Mit der folgenden Abfrage und den folgenden Ergebnissen suche ich nach dem neuesten Eintrag, bei dem ChargeId und ChargeType eindeutig sind.

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

Gewünscht:

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

Antworten:

147

Sie können ein GROUP BY verwenden , um Elemente nach Typ und ID zu gruppieren. Anschließend können Sie die MAX () - Aggregatfunktion verwenden, um den letzten Servicemonat abzurufen. Im Folgenden wird eine Ergebnismenge mit ChargeId, ChargeType und MostRecentServiceMonth zurückgegeben

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE
Mitchel Sellers
quelle
1
Vergessen Sie nicht, das Feld MAX (serviceMonth) als Alias ​​zu verwenden, falls Sie es nachgeschaltet benötigen.
Ben Hoffstein
2
ok, was passiert also, wenn die Tabelle eine Zeile 101 N 1/1/2008 enthält?
Tvanfosson
3
Sie würden eine zusätzliche Zeile zurückbekommen. Welches ist das gewünschte Ergebnis basierend auf seinen Anforderungen.
Carlton Jenke
1
Alias ​​zur Abfrage im Beitrag hinzugefügt. tvanfosson - das wäre eine Bedingung, die zur Ergebnismenge hinzugefügt wird, was korrekt ist.
Mitchel Sellers
1
Wenn ich auch die Datensatz-ID damit ziehen wollte. Wie würde ich das machen?
Donny V.
58

Dies ist also nicht das, wonach der Anforderer gefragt hat, sondern die Antwort auf "SQL-Auswahl von Zeilen nach dem letzten Datum".

Geändert von 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
quelle
2
Danke dir! Das habe ich gesucht!
Diana
Scheint nicht mit Ansichten kompatibel zu sein.
Nuzzolilo
11
SELECT chargeId, chargeType, MAX(serviceMonth) AS serviceMonth 
FROM invoice
GROUP BY chargeId, chargeType
Ben Hoffstein
quelle
6

Ich sehe, dass die meisten Entwickler Inline-Abfragen verwenden, ohne die Auswirkungen auf große Datenmengen zu untersuchen.

In einfachen Worten können Sie dies erreichen durch:

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

Die obige Abfrage funktioniert, wenn die eindeutige Gebühren-ID unterschiedliche Chargetyp-Kombinationen aufweist. Hoffentlich hilft diese einfache Abfrage bei geringer Leistungsdauer ...

pari elanchezhiyan
quelle