2017-09-06 2 views
1

ich zu einer Gruppe bin versucht, dieses Ergebnis:Sql Gruppe von Datum Abfrage

ID TEXT    Table1 FK1 Nodedate 
940 bov1    TASKS 48 2016-10-26 15:53:20.247 
938 foxxxxdsx  TASKS 48 2016-10-26 15:49:15.083 
937 test2   TASKS 48 2016-10-26 15:24:32.667 
936 test    TASKS 48 2016-10-26 15:24:20.277 
889 <>asdasdsa  TASKS 48 2016-09-19 11:23:02.083 
600 sadadasasdadsa TASKS 48 2016-08-29 15:03:11.680 

In

nur
ID TEXT    Table1 FK1 Nodedate 
940 bov1    TASKS 48 2016-10-26 15:53:20.247 

ist es eine Möglichkeit, um ein Ergebnis zu einer Gruppe nur mit dem Datum?

aktuelle Abfrage:

SELECT N.ID As ID , n.Text as Text ,Table1 , FK1 ,N.Created as notedate 
FROM NOTES N With(nolock) 
LEFT OUTER JOIN NOTELinks NL On(N.id = NL.noteid) 
WHERE Table1 = 'TASKS' AND N.IsSystem =0 AND FK1=48 
GROUP BY Table1 , FK1 
order by N.Created desc 
+0

Fügen Sie 'CAST (N.Created AS DATE)' zu der 'GROUP BY'-Klausel ... –

+1

Warum sind die Daten' 2016-09-19 'und' 2016-08-29' von den Ergebnissen Ihrer Anfrage ausgeschlossen? –

+0

Ich brauche die neueste – Ozzman1893

Antwort

2

Wollen Sie nur den jüngsten Rekord?

SELECT TOP 1 
    N.ID As ID, 
    N.Text AS Text, 
    Table1, 
    FK1, 
    N.Created AS notedate 
FROM NOTES N WITH (NOLOCK) 
LEFT JOIN NOTELinks NL 
    ON N.id = NL.noteid 
WHERE 
    Table1 = 'TASKS' AND 
    N.IsSystem = 0 AND 
    FK1 = 48 
ORDER BY N.Created DESC 

Wenn Sie die neueste Datensatz für jede Table1 und FK1 Gruppe finden müssen dann prüfen, eine analytische Funktion:

SELECT t.ID, t.Text, t.Table1, t.FK1, t.notedate 
FROM 
(
    SELECT TOP 1 N.ID As ID, N.Text as Text, Table1, FK1, N.Created AS notedate, 
     RANK() OVER (PARTITION BY Table1, FK1 ORDER BY N.Created DESC) rank 
    FROM NOTES N With(nolock) 
    LEFT JOIN NOTELinks NL 
     ON N.id = NL.noteid 
    WHERE Table1 = 'TASKS' AND N.IsSystem = 0 AND FK1 = 48 
) t 
WHERE t.rank = 1; 

ich RANK lieber hier verwendet als ROW_NUMBER in dem Fall, dass zwei oder mehr Datensätze könnte für den neuesten Rekord gebunden sein. In diesem Fall würde die obige Abfrage alle Verbindungen zurückgeben.

0

Ich rate ROW_NUMBER() über die Verwendung, denn wenn die Forderung nach mehr als 1 FK1 ist, oder Sie benötigen einen OFFSET dann kann es nicht mit TOP erfolgen:

SELECT p.* FROM (
    SELECT ..... 
      ROW_NUMBER() OVER(PARTITION BY n.FK1 ORDER BY n.created DESC) as rnk 
    FROM .... // REST OF THE QUERY) p 
WHERE p.rnk = 1 

Diese Dynamik ist alles zurück die Die neuesten Datensätze für jede FK1 existiert