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

Abfrage bei doppelten Einträgen (Datum) höchsten Wert nehmen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von dash_, 3 Mai 2017.

  1. dash_

    dash_ Benutzer

    Sehr geehrte Community,

    ich bin neu in der Datenbank schiene und muss folgendes Problem lösen.

    Meine Tabelle die ich habe sieht folgendermaßen aus:
    Das Ausgabe Ergebnis sollte dann so aussehen:

    Ich habe schon probiert mit verschiedenen Befehlen zum gewünschten Ergebnis zu kommen, jedoch ohne Erfolg. DISTINCT, MAX, GROUP BY, HAVING COUNT etc....

    Kann mir jemand Tipps geben mein Problem zu lösen?

    Über jegliche Denkanstöße wäre ich sehr dankbar.

    Gruß
    dash_
     
  2. akretschmer

    akretschmer Datenbank-Guru

    such dir was aus...

    Code:
    test=*# select * from dash ;
     plan |  datum  | menge
    ------+------------+-------
      395 | 2017-05-03 |  34
      395 | 2017-05-04 |  34
      396 | 2017-05-04 |  35
      395 | 2017-05-05 |  40
      410 | 2017-05-05 |  41
      407 | 2017-05-06 |  34
    (6 Zeilen)
    
    test=*# select distinct on (plan) plan, datum, menge from dash order by plan, datum;
     plan |  datum  | menge
    ------+------------+-------
      395 | 2017-05-03 |  34
      396 | 2017-05-04 |  35
      407 | 2017-05-06 |  34
      410 | 2017-05-05 |  41
    (4 Zeilen)
    
    test=*# select * from dash where (plan, datum) in (select plan, min(datum) from dash group by plan) order by plan, datum;
     plan |  datum  | menge
    ------+------------+-------
      395 | 2017-05-03 |  34
      396 | 2017-05-04 |  35
      407 | 2017-05-06 |  34
      410 | 2017-05-05 |  41
    (4 Zeilen)
    
    test=*#
    
    test=*# select * from dash right join (select plan, min(datum) as datum from dash group by plan) foo using (plan, datum) order by plan;
     plan |  datum  | menge
    ------+------------+-------
      395 | 2017-05-03 |  34
      396 | 2017-05-04 |  35
      407 | 2017-05-06 |  34
      410 | 2017-05-05 |  41
    (4 Zeilen)
    
     
  3. ukulele

    ukulele Datenbank-Guru

    Die letzte Abfrage sollte sich in MSSQL nutzen lassen, bei der Syntax davor bin ich mir nicht sicher.
     
  4. dash_

    dash_ Benutzer

    Vielen Dank erstmal für die schnelle Rückmeldung.

    Was bewirkt das foo using?
    Ich werde das dann gleich mal probieren!
     
  5. akretschmer

    akretschmer Datenbank-Guru

    foo ist ein Alias und using Teil des Joins.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    erstere ist eine sehr praktische, aber nicht-standardkonforme Erweiterung von PostgreSQL (wie man schon rein optisch sieht, die kürzeste Lösung), der Rest eigentlich normales SQL. Sollten alle halbwegs gescheiten Datenbanken können.
     
  7. ukulele

    ukulele Datenbank-Guru

    Code:
    WITH t(s1,s2) AS (
       SELECT   1,2
       )
    SELECT   *
    FROM   t
    WHERE   (s1,s2) IN (   SELECT   s1,s2
                 FROM   t )
    Funktioniert leider nicht in MSSQL, ich habe das vor geraumer Zeit auch schon vermisst. Er kann leider nur eine Spalte mit IN vergleichen, man müsste das also in einen Join umbauen:
    Code:
    WITH t(s1,s2) AS (
       SELECT   1,2
       )
    SELECT   t1.*
    FROM   t t1
    INNER JOIN t t2
    ON     t1.s1 = t2.s1
    AND     t1.s2 = t2.s2
     
  8. dash_

    dash_ Benutzer

    Hallo ukulele,

    bei mir klappen die Abfragen, die akretschmer gepostet haben leider wirklich nicht.
    Vielleicht bin ich auch zu Blöd dafür.
    Aber kannst du mir deinen Code etwas erläutern?
    Komme nicht dahinter wie der funktionieren soll.

    Gruß
    dash_
     
  9. akretschmer

    akretschmer Datenbank-Guru

    gar keine?
     
  10. ukulele

    ukulele Datenbank-Guru

    Also ich vermute du suchst in etwa das hier:
    Code:
    SELECT   t.*,
         tabelle.MENGE
    FROM   (
    
    SELECT   [PLAN],
         min(DATUM) AS DATUM
    FROM   tabelle
    
         ) t
    LEFT JOIN tabelle
    ON     t.[PLAN] = tabelle.[PLAN]
    AND     t.DATUM = tabelle.[DATUM]
     
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