ID's Gruppieren und anzeigen 1 weiterer Spalten nur der Jüngste eintrag

Appa1990

Neuer Benutzer
Beiträge
4
Hallo Zusammen,
ich verzweifle schon seit einigen Tagen an einer abfrage.
Ich habe eine Tabelle mit den Spalten ID, MID, DATE und REASON.
Was ich jetzt möchte ist eine Abfrage wo die MID's gruppiert sind und dazu den jüngsten REASON Eintrag.

Was ich hinbekommen habe ist das ich nur den aktuellsten Eintrag bekomme aber nicht von jeder MID

SELECT distinct
TABELLE.MID
FROM (TABELLE
left join TABELLE a2 on a2.Id = TABELLE.id)
where a2.DATE = (select max(DATE) from TABELLE)

es erscheint mir auch logisch das nur ein wert zurück kommt.
Ich hoffe jemand kann mir helfen...

Ich nutze MSSQL 2014 und die Spalten sind alles INTEGER

Grüße Appa1990

edit:
ich glaube ich hab es hinbekommen...

SELECT distinct
a.[MID],
a.REASON




FROM TABELLE a
where a.DATE = (select max(b.DATE) from TABELLE b where a.MID = b.MID)
Order by MID
 
Zuletzt bearbeitet:
Werbung:
In MSSQL 2014 führen einige Lösungen zum Ziel. Gruppieren und weitere Spalten zu dem gruppierten ergebnis dazu joinen hätte ich früher so gemacht, mittlerweile nutze ich eigentlich immer eine Sortierung dafür, Beispiel:
Code:
SELECT * FROM (

SELECT ROW_NUMBER() OVER (PARTITION BY MID ORDER BY DATE DESC) AS zeile,* FROM Tabelle

)
WHERE zeile = 1
Dein gezeigter Code dürfte auch laufen, wenn du Pech hast wird aber der Subselect zu jedem Datensatz einmal ausgeführt.
 
Moin Ukulele,

Danke für deine Antwort.
Das würde glaube ich nicht so ganz funktionieren. Die MID=1 kann auch doppelt hintereinander drin stehen, bevor die MID=2 einen Eintrag hat.
Dazu möchte ich ja auch alle möglichen MID's da stehen haben.

Also quasi so:

MID | REASON
1 | 58|
2 | 34 |
3 | 64 |

Die Daten könnten so drin stehen

ID | MID | DATE | REASON
5 | 3| 10.08.18 12:00 | 64 |
4 | 3 | 10.08.18 11:59 | NULL |
3 | 2 | 10.08.18 11:58 | 34 |
2 | 1 | 10.08.18 10:59 | 58 |
1 | 2 | 10.08.18 10:58 | 34 |

Grüße Appa
 
Doch funktioniert:
Code:
WITH tabelle(ID,MID,[DATE],REASON) AS (
SELECT   5,3,'2018-08-10 12:00:00.000',64 UNION ALL
SELECT   4,3,'2018-08-10 11:59:00.000',NULL UNION ALL
SELECT   3,2,'2018-08-10 11:58:00.000',34 UNION ALL
SELECT   2,1,'2018-08-10 10:59:00.000',58 UNION ALL
SELECT   1,2,'2018-08-10 10:58:00.000',34
   )
SELECT   t.MID,
       t.REASON
FROM   (

SELECT   ROW_NUMBER() OVER (PARTITION BY MID ORDER BY DATE DESC) AS zeile,
       *
FROM   tabelle

   ) t
WHERE   t.zeile = 1
Dürfte auf große Datenmengen schneller sein, einfach mal testen.
 
Doch funktioniert:
Code:
WITH tabelle(ID,MID,[DATE],REASON) AS (
SELECT   5,3,'2018-08-10 12:00:00.000',64 UNION ALL
SELECT   4,3,'2018-08-10 11:59:00.000',NULL UNION ALL
SELECT   3,2,'2018-08-10 11:58:00.000',34 UNION ALL
SELECT   2,1,'2018-08-10 10:59:00.000',58 UNION ALL
SELECT   1,2,'2018-08-10 10:58:00.000',34
   )
SELECT   t.MID,
       t.REASON
FROM   (

SELECT   ROW_NUMBER() OVER (PARTITION BY MID ORDER BY DATE DESC) AS zeile,
       *
FROM   tabelle

   ) t
WHERE   t.zeile = 1
Dürfte auf große Datenmengen schneller sein, einfach mal testen.

Moin nochmal,

Jupp funzt astrein!
Lädt aber fast genau so lange. Vielleicht hat der SQL-Server aber auch gerade ein schlechten Tag.
Immerhin ist ja Montag :D
 
WINDOW-Funktionen sind nicht zwingend performant ...

Fall je MID viele Datensätze existieren, kommst Du besser, wenn du sinngemäß ein

select * from table where (mid, datum) in (select mid, max(datum) from table group by mid)

machst. Ein passender Index auf (mid, datum desc) könnte hilfreich sein.
 
WINDOW-Funktionen sind nicht zwingend performant ...

Fall je MID viele Datensätze existieren, kommst Du besser, wenn du sinngemäß ein

select * from table where (mid, datum) in (select mid, max(datum) from table group by mid)

machst. Ein passender Index auf (mid, datum desc) könnte hilfreich sein.

Hallo,

das ist ja jetzt schon ein paar Tage her, aber ich hab mich daran Versucht, da ich ein ähnliches Thema habe.
Wie kann ich denn meiner WHERE Klausel 2 Bedingungen mitgeben un über in Abfragen. Subselect ist klar.
Aber die Stelle "(mid, datum) in" dort scheitere ich aktuell.
Mein System ist ein MsSQL Server ;-)

Danke schon mal
 
Hmmm okay, das hatte ich getestet ...
... sah dann so aus:

select *
from table as a
where a.mid = b.mid AND a.datum = b.Datum
in (select mid, max(datum) as Datum
from table group by mid) as b
 
Ich weiß was du suchst, im prinzip
Code:
SELECT * FROM t1 WHERE (s1,s2) IN ( SELECT s1,min(s2) AS s2 FROM t2 GROUP BY s1 )
Das geht in MSSQL meines Wissens nach so nicht.

Wenn du das nicht grade so einbauen kannst
Code:
SELECT * FROM t1 WHERE s2 IN ( SELECT min(s2) FROM t2 WHERE t2.s1 = t1.s1 )
musst du joinen, z.B. so
Code:
SELECT t1.*,t3.s1 FROM t1 INNER JOIN ( SELECT s1,min(s2) AS s2 FROM t2 GROUP BY s1 ) t3 ON t1.s1 = t3.s1
 
Werbung:
Zurück
Oben