web-dev-qa-db-de.com

Wählen Sie Informationen aus der Tabelle aus, bei denen die Zeile maximales Datum hat

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

33
kqlambert
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).

90
Twelfth

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.

25
Andriy M

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
1
SELECT distinct
  group, 
  max_date = MAX(date) OVER (PARTITION BY group), checks
FROM table

Sollte arbeiten.

0
Heather WWW