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

dash_

Benutzer
Beiträge
15
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:
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

Das Ausgabe Ergebnis sollte dann so aussehen:

PLAN | DATUM | MENGE |
395 | 2017-05-03 | 34
396 | 2017-05-04 | 35
410 | 2017-05-05 | 41
407 | 2017-05-06 | 34

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_
 
Werbung:
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)
 
Die letzte Abfrage sollte sich in MSSQL nutzen lassen, bei der Syntax davor bin ich mir nicht sicher.
 
Vielen Dank erstmal für die schnelle Rückmeldung.

Was bewirkt das foo using?
Ich werde das dann gleich mal probieren!
 
Die letzte Abfrage sollte sich in MSSQL nutzen lassen, bei der Syntax davor bin ich mir nicht sicher.

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.
 
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
 
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_
 
Werbung:
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]
 
Zurück
Oben