it-swarm.com.de

Datensätze basierend auf letztem Datum auswählen

Basierend auf der unten genannten Tabelle Course:

enter image description here

Wie kann ich Datensätze auswählen, die den Kursnamen mit dem neuesten Datum haben? Ich meine, wenn ich zwei gleiche Kursnamen für eine ID habe, sollte ich nur den neuesten als untenstehendes Ergebnis anzeigen.

Ich möchte nur die letzte Zeile pro anzeigen ("ID", "Name des Kurses").

enter image description here

Und was ist, wenn ich in der Kurstabelle zwei Datumsspalten habe, StartDate und EndDate, und ich nur die gleichen Werte basierend auf EndDate anzeigen möchte?

Ich verwende PostgreSQL.

12
Aan

Um in PostgreSQL eindeutige Zeilen für eine definierte Menge von Spaltenzu erhalten, ist _ die bevorzugte Technik im Allgemeinen DISTINCT ON :

SELECT DISTINCT ON ("ID") *
FROM   "Course"
ORDER  BY "ID", "Course Date" DESC NULLS LAST, "Course Name";

Angenommen, Sie verwenden tatsächlich diese unglücklichen Großbuchstaben mit Leerzeichen.

Sie erhalten auf diese Weise genau eine Zeile per ID - den mit dem letzten bekannten "Course Date" und den ersten "Course Name" (je nach Sortierreihenfolge) bei Verbindungen am Datum.

Sie können NULLS LAST löschen, wenn Ihre Spalte NOT NULL definiert ist.

Um eindeutige Zeilen pro ("ID", "Course Name") zu erhalten:

SELECT DISTINCT ON ("ID", "Course Name") *
FROM   "Course"
ORDER  BY "ID", "Course Name", "Course Date" DESC NULLS LAST;

Details in dieser verwandten Antwort:

20
SELECT *
FROM (SELECT ID, CourseName, CourseDate, 
      MAX(CourseDate) OVER (PARTITION BY COURSENAME) as MaxCourseDate
FROM Course) x
WHERE CourseDate = MaxCourseDate

Hier können Sie mit MAX () OVER (PARTITION BY) das höchste Kursdatum für jeden Kurs (die Partition) in einer abgeleiteten Tabelle ermitteln. Dann können Sie einfach für die Zeilen auswählen, bei denen das CourseDate gleich der maximalen Kursdauer ist, die für diesen Kurs gefunden wurde. 

Dieser Ansatz hat den Vorteil, dass keine GROUP BY-Klausel verwendet wird. Dies würde die Spalten einschränken, die Sie zurückgeben könnten, da jede andere Spalte in der SELECT-Klausel auch in der GROUP BY-Klausel enthalten sein muss.

3
GVIrish
SELECT "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
3

Versuche dies:

SELECT DISTINCT ON (c."Id", c."Course Name") 
    c."Id", c."Course Name", c."Course Date" 
FROM (SELECT * FROM "Course" ORDER BY "Course Date" DESC) c;
0
Minoru