Query: doppelte Einträge nach Datum filtern

BenniQuery

Benutzer
Beiträge
7
Hey,

ich komme einfach nicht weiter und habe diese Forum gefunden. Wahrscheinlich gibt es für mein Problem eine ziemlich simple Lösung aber ich bekomme es aktuell einfach nicht hin und weiß auch nicht richtig nach was ich suchen soll.

Problem:
Ich habe in einer Tabelle verschiedene Einträge die alle gleich sind bis auf das Datum. Jetzt hätte ich gerne eine Liste ausgegeben mit diesen Einträgen und bei allen doppelten wird nur der Einträg mit dem aktuellsten Datum genommen. Also quasi ein Filter der alle doppelten aussortiert und den aktuellsten Eintrag zurückgibt. Wie kann man das in SQL umsetzen?

Danke im Voraus

Viele Grüße
Benni
 
Werbung:
also in etwa so, oder?

Code:
test=*# select * from bennyquery ;
 data |   datum   
------+------------
 a    | 2020-12-18
 a    | 2020-12-16
 a    | 2020-12-14
 b    | 2020-12-14
 b    | 2020-12-16
 b    | 2020-12-17
 2    | 2020-12-17
 2    | 2020-12-08
 2    | 2020-12-13
(9 rows)
test=*# select data, max(datum) from bennyquery group by data order by data;
 data |    max     
------+------------
 2    | 2020-12-17
 a    | 2020-12-18
 b    | 2020-12-17
(3 rows)
 
Ja so in etwa. Allerdings habe ich gerade festgestellt, dass ein sich eine Spalte doch immer wieder ändert. Diese Spalte hat einen Wert abhängig von dem Datum und ich möchte quasi den aktuellsten Wert.
 
Sorry. Also proc_name ist gleich und ass_name ist gleich. Diese Einträge haben verschiedene Werte und der aktuellste Eintrag ist meinem Beispiel vom 10.12.20. Jetzt möchte ich aber nur diesen Eintrag mit dem aktuellsten Wert.
 

Anhänge

  • Beispiel.PNG
    Beispiel.PNG
    3,5 KB · Aufrufe: 4
select * from your_table where ass_date = (select max(ass_date from your_table);

Bilder sind Murks, die kann man nicht via Copy&Paste sich in eine eigene Tabelle kopieren. Wäre nett, es den Helfenden nicht unnötig schwer zu machen ...
 
Okay. Jetzt werden aber nur von allen Einträgen die aktuellsten gefiltert. Also falls ich heute einen Eintrag erstellen würde, würde ich nur diesen angezeigt bekommen. Es sollen aber jeweils die aktuellsten Einträge abhängig von proc_name ass_name selektiert werden.
Beispiel:
Der SQL Befehl soll die 2 aktuellsten Werte liefern. Also:
proj_name ass_name ass_value ass_date
SYS.2 BP 01 N 2020-12-01
SYS.2 BP 01 P 2020-12-03
SYS.2 BP 01 L 2020-12-10
SYS.2 BP 01 F 2020-12-11
SYS.2 BP 02 N 2020-12-08
SYS.2 BP 02 P 2020-12-10
SYS.2 BP 02 L 2020-12-22

SQL Befehl -->

SYS.2 BP 01 F 2020-12-11
SYS.2 BP 02 L 2020-12-22
 
okay ...

Code:
test=*# select * from benniquery ;
 ass_name | ass_value |  ass_date  
----------+-----------+------------
 BP 01    | N         | 2020-12-01
 BP 01    | P         | 2020-12-03
 BP 01    | L         | 2020-12-10
 BP 01    | F         | 2020-12-11
 BP 02    | N         | 2020-12-08
 BP 02    | P         | 2020-12-10
 BP 02    | L         | 2020-12-22
(7 rows)
test=*# select distinct on (ass_name) ass_name, ass_value, ass_date from benniquery order by ass_name, ass_date desc;
 ass_name | ass_value |  ass_date  
----------+-----------+------------
 BP 01    | F         | 2020-12-11
 BP 02    | L         | 2020-12-22
(2 rows)

DISTINCT ON (...) wird aber Dein M$SQL nicht können, weil das ist eine der vielen coolen Erweiterungen von PostgreSQL und nicht SQL-konform.

Code:
test=*# select * from benniquery where (ass_name,ass_date) in (select ass_name, max(ass_date) from benniquery group by ass_name);
 ass_name | ass_value |  ass_date  
----------+-----------+------------
 BP 01    | F         | 2020-12-11
 BP 02    | L         | 2020-12-22
(2 rows)

Das könnte schon eher funktionieren...
 
Okay. Also meine Subquery liefert schonmal die richtigen Ergebnisse. Allerdings schaffe ich es nicht meine Subquery in meine gesamte query einzubinden.
Irgendwas stimmt zwischen WHERE und IN noch nicht.

akutelles Statement:

SELECT dbo.assessment.ass_ID, dbo.project.proj_name, dbo.process.proc_name, dbo.assessment.ass_name, dbo.assessment.ass_value, dbo.assessment.ass_date, dbo.assessment.ass_strength, dbo.assessment.ass_weakness, dbo.assessment.ass_activities
FROM dbo.assessment INNER JOIN
dbo.process ON dbo.assessment.proc_ID = dbo.process.proc_ID INNER JOIN
dbo.project ON dbo.process.proj_ID = dbo.project.proj_ID

WHERE proj_name, proc_name, ass_name, ass_date IN (SELECT proj_name, proc_name, ass_name, max(ass_date)
FROM dbo.assessment INNER JOIN
dbo.process ON dbo.assessment.proc_ID = dbo.process.proc_ID INNER JOIN
dbo.project ON dbo.process.proj_ID = dbo.project.proj_ID
GROUP BY proj_name, proc_name, ass_name)

Das ist meine aktelle Fehlermeldung:
An expression of non-boolean type specified in a context where a condition is expected, near ','.
 
SELECT dbo.assessment.ass_ID, dbo.project.proj_name, dbo.process.proc_name, dbo.assessment.ass_name, dbo.assessment.ass_value, dbo.assessment.ass_date, dbo.assessment.ass_strength, dbo.assessment.ass_weakness, dbo.assessment.ass_activities
FROM dbo.assessment INNER JOIN
dbo.process ON dbo.assessment.proc_ID = dbo.process.proc_ID INNER JOIN
dbo.project ON dbo.process.proj_ID = dbo.project.proj_ID

where (proj_name, proc_name, ass_name, ass_date) IN (select proj_name, proc_name, ass_name, max(ass_date)
FROM dbo.assessment INNER JOIN
dbo.process ON dbo.assessment.proc_ID = dbo.process.proc_ID INNER JOIN
dbo.project ON dbo.process.proj_ID = dbo.project.proj_ID
GROUP BY proj_name, proc_name, ass_name)


So sollte es doch eigentlich passen.
Hier bekomme ich:
An expression of non-boolean type specified in a context where a condition is expected, near ','.
proj_name wird dabei von SQL Server Management Studio markiert.
 
Könnte sein, dass Deine Datenbank das einfach nicht kann. Das kann ein Postgres-Spezialist nicht unbedingt wissen.

Du müsstest in dem Fall die angemeckerte Stelle in einen normalen Join umbauen.
 
Werbung:
Danke an Alle. Habe es jetzt durch einen INNER JOIN so lösen können:

SELECT dbo.assessment.ass_ID, dbo.project.proj_name, dbo.process.proc_name, dbo.assessment.ass_name, dbo.assessment.ass_value, dbo.assessment.ass_date, dbo.assessment.ass_strength, dbo.assessment.ass_weakness, dbo.assessment.ass_activities
FROM dbo.assessment INNER JOIN
dbo.process ON dbo.assessment.proc_ID = dbo.process.proc_ID INNER JOIN
dbo.project ON dbo.process.proj_ID = dbo.project.proj_ID

INNER JOIN (SELECT proj_name, proc_name, ass_name, max(ass_date) as ass_date
FROM dbo.assessment INNER JOIN
dbo.process ON dbo.assessment.proc_ID = dbo.process.proc_ID INNER JOIN
dbo.project ON dbo.process.proj_ID = dbo.project.proj_ID
GROUP BY proj_name, proc_name, ass_name) A
ON dbo.project.proj_name = a.proj_name AND dbo.process.proc_name = a.proc_name AND dbo.assessment.ass_name = a.ass_name AND dbo.assessment.ass_date = a.ass_date

ORDER BY dbo.process.proc_name, dbo.assessment.ass_name


Das WHERE Statement hat bei mir nicht gefunzt.
 
Zurück
Oben