2016-05-24 9 views
0

Ich bin ein SQL-Novize und versuche, eine Möglichkeit zu finden, Zeilen zu zerlegen, die mir grundsätzlich nur einen Namen pro Zeile gibt, mit dem Kriterium "Encounter Date". Ich möchte von diesem gehen:Auswählen von Zeilen, die auf das letzte Datum beschränkt sind

Measure_ID Name User Encounter Date Numerator 
    NQF-0101  A  1   4/10/2015  0 
    NQF-0101  A  1   4/11/2015  1 
    NQF-0101  B  2   4/12/2015  1 
    NQF-0101  B  2   4/13/2015  0 
    NQF-0101  C  3   4/14/2015  1 
    NQF-0101  C  3   4/15/2015  1 
    NQF-0101  C  3   4/16/2015  1 

Um dies:

Measure_ID Name User Encounter Date Numerator 
    NQF-0101  A  1   4/11/2015   1 
    NQF-0101  B  2   4/13/2015   0 
    NQF-0101  C  3   4/16/2015   1 

Irgendwelche Gedanken über die Art der SQL-Abfrage, die ich laufen kann, damit dies geschieht? Vielen Dank!

+1

Welche dbms verwenden Sie? –

+0

SELECT * FROM Tabellenname GROUP BY Name ORDER BY Encounter_Date? – Alfie

+0

Ich verwende tatsächlich benutzerdefinierte SQL in Tableau; Ich bin mir nicht sicher, ob es ähnlich zu anderen dbms ist. – Josh

Antwort

0

Unter der Annahme, User und Encounter Date sind einzigartig, dann

Select t.* 
from MyTable t 
join (select User, max([Encounter Date]) as [Encounter Date] 
     from MyTable 
     group by User) q 
on q.User= t.User and q.[Encounter Date] = t.[Encounter Date] 

funktionieren sollte.

1

Wenn Sie SQL Server verwenden, oder andere dbms die Fensterfunktion unterstützt, können Sie ROW_NUMBER verwenden:

WITH CTE AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY Measure_ID, User ORDER BY EncounterDate DESC) 
    FROM tbl 
) 
SELECT * 
FROM CTE 
WHERE rn = 1 

Wenn nicht, können Sie die MAX Funktion:

SELECT t1.* 
FROM tbl t1 
INNER JOIN (
    SELECT 
     Measure_ID, User, MAX(EncounterDate) AS MaxDate 
    FROM tbl 
    GROUP BY Measure_ID, User 
) t2 
    ON t1.Measure_ID = t2.Measure_ID 
    AND t1.User = t2.User 
    AND t1.EncouterDate = t2.MaxDate 
0

Sie können die Funktion ROW_NUMBER() verwenden, um jede Zeile nach der Spalte Begegnungs- Datum innerhalb einer Gruppe basierend auf der Namensspalte zu sortieren.

Die OVER()-Klausel partitioniert die Tabelle nach der Spalte name und ordnet die Zeilen innerhalb jeder Partition nach ihrem Encounter-Datum an.

SELECT 
    measure_id 
    ,name 
    ,[user] 
    ,encounter_date 
    ,numerator 
FROM(
    SELECT 
    measure_id 
    ,name 
    ,[user] 
    ,encounter_date 
    ,numerator 
    ,ROW_NUMBER() OVER(PARTITION BY name ORDER BY encounter_date DESC) AS row_num 
    FROM test 
)q 
WHERE row_num = 1 

Mit einer Unterabfrage können Sie alles außer der letzten Zeile herausfiltern.

Hier arbeitet das Beispiel in einem sqlfiddle: http://sqlfiddle.com/#!6/ba10b/2

Verwandte Themen