Mein Tisch sieht ungefähr so aus:
group date cash checks
1 1/1/2013 0 0
2 1/1/2013 0 800
1 1/3/2013 0 700
3 1/1/2013 0 600
1 1/2/2013 0 400
3 1/5/2013 0 200
- Sie brauchen kein Bargeld, nur um zu zeigen, dass die Tabelle weitere Informationen enthält
Ich möchte die einzelnen eindeutigen Gruppen abrufen, bei denen das Datum maximal ist und die Prüfungen größer als 0 sind. Die Rendite würde also etwa wie folgt aussehen:
group date checks
2 1/1/2013 800
1 1/3/2013 700
3 1/5/2013 200
versuchter Code:
SELECT group,MAX(date),checks
FROM table
WHERE checks>0
GROUP BY group
ORDER BY group DESC
problem dabei ist, dass es mir alle Daten und Überprüfungen gibt, nicht nur die maximale Datumszeile.
ms SQL Server 2005 verwenden
SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group
Das funktioniert, um das maximale Datum abzurufen. Verbinden Sie es mit Ihren Daten, um die anderen Spalten zu erhalten:
Select group,max_date,checks
from table t
inner join
(SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group)a
on a.group = t.group and a.max_date = date
Inner Join fungiert als Filter, um nur den maximalen Datensatz abzurufen.
Zu Ihrer Information, Ihre Spaltennamen sind schrecklich, verwenden Sie keine reservierten Wörter für Spalten (Gruppe, Datum, Tabelle).
Sie können ein window MAX () wie folgt verwenden:
SELECT
*,
max_date = MAX(date) OVER (PARTITION BY group)
FROM table
um maximale Daten pro group
zusammen mit anderen Daten zu erhalten:
group date cash checks max_date
----- -------- ---- ------ --------
1 1/1/2013 0 0 1/3/2013
2 1/1/2013 0 800 1/1/2013
1 1/3/2013 0 700 1/3/2013
3 1/1/2013 0 600 1/5/2013
1 1/2/2013 0 400 1/3/2013
3 1/5/2013 0 200 1/5/2013
Wenn Sie die obige Ausgabe als abgeleitete Tabelle verwenden, können Sie nur Zeilen abrufen, in denen date
mit max_date
übereinstimmt:
SELECT
group,
date,
checks
FROM (
SELECT
*,
max_date = MAX(date) OVER (PARTITION BY group)
FROM table
) AS s
WHERE date = max_date
;
um das gewünschte Ergebnis zu erhalten.
Im Grunde ist dies dem Vorschlag von @ Twelfth ähnlich , vermeidet jedoch einen Join und ist daher möglicherweise effizienter.
Sie können die Methode in SQL Fiddle ausprobieren.
sie können Join so verwenden. Wenn Sie IN verwenden, versuchen Sie, dies langsam zu vermeiden.
SELECT * FROM (SELECT msisdn, callid, Change_color, play_file_name, date_played FROM insert_log
WHERE play_file_name NOT IN('Prompt1','Conclusion_Prompt_1','silent')
ORDER BY callid ASC) t1 JOIN (SELECT MAX(date_played) AS date_played FROM insert_log GROUP BY callid) t2 ON t1.date_played=t2.date_played
SELECT distinct
group,
max_date = MAX(date) OVER (PARTITION BY group), checks
FROM table
Sollte arbeiten.