SQL SELECT wechselnde Zeilen basierend auf Dept-ID und date hinzugefügt

Ich muss den letzten datasatz für jede Dept wählen, dann die 2. letzte, dann die 3., etc. Jede Abteilung kann eine beliebige Anzahl von datasätzen mit unterschiedlichen data haben, so gibt es keine Korrelation. Ich verwende SQL server.

TABLE PROD ( PRODNAME VARCHAR(50), DEPTID INT, ADDED DATEIME ) 

Ich brauche die Ergebnisse so aussehen:

 PRODNAME DEPTID ADDED ------------------------------ Q 1 2014-08-05 <-- DEPT 1, 1ST MOST RECENT X 2 2014-08-05 <-- DEPT 2, 1ST MOST RECENT W 3 2013-05-23 <-- DEPT 3, 1ST MOST RECENT P 1 2014-07-12 <-- DEPT 1, 2ND MOST RECENT A 2 2013-09-10 <-- DEPT 2, 2ND MOST RECENT K 3 2013-01-12 <-- DEPT 3, 2ND MOST RECENT L 1 2014-07-05 <-- DEPT 1, 3RD MOST RECENT (NO MORE DEPT 2 RECORDS AVAILABLE, SO GO TO NEXT DEPT) G 3 2012-12-18 <-- DEPT 3, 3RD MOST RECENT 

   

Sie können dies mit der function ROW_NUMBER() tun:

 ;WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY DeptID ORDER BY Added DESC) RN FROM Table1) SELECT Prodname, DeptID, Added FROM cte ORDER BY RN, DeptID 

Demo: SQL-Geige

Die function ROW_NUMBER() weist jeder Zeile eine Zahl zu. PARTITION BY ist optional, aber verwendet, um die Nummerierung für jeden Wert in dieser Gruppe zu starten, dh: Wenn Sie PARTITION BY DeptID dann für jeden eindeutigen DeptID Wert die Nummerierung würde bei 1 beginnen. ORDER BY natürlich verwendet, um zu definieren, wie die Zählen sollte gehen und ist in der function ROW_NUMBER() erforderlich.

Wenn du in der obigen Abfrage SELECT * bist, kannst du einen Sinn dafür haben, wie die function ROW_NUMBER() funktioniert.

Bearbeiten: Aktualisiertes SQL-Geige mit Beispiel für fehlende deptid