1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

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

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Appa1990, 9 August 2018.

  1. Appa1990

    Appa1990 Neuer Benutzer

    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: 9 August 2018
  2. ukulele

    ukulele Datenbank-Guru

    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.
     
  3. Appa1990

    Appa1990 Neuer Benutzer

    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
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
    GrafvonAdviller gefällt das.
  5. Appa1990

    Appa1990 Neuer Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  7. GrafvonAdviller

    GrafvonAdviller Benutzer

    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
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Sehr geehrter Herr Graf von Adviller,

    das ist eine AND-Verknüpfung.
     
    GrafvonAdviller gefällt das.
  9. GrafvonAdviller

    GrafvonAdviller Benutzer

    Hallo akretschmer ;)

    das UND war einleuchtend, aber ich bekomme den Syntax nicht hin.

    Liebe Grüße vom Graf ;)
     
  10. akretschmer

    akretschmer Datenbank-Guru

    aus (a,b) = (c,d) mache a=c AND b=d
     
    GrafvonAdviller gefällt das.
  11. GrafvonAdviller

    GrafvonAdviller Benutzer

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden