2017-09-06 107 views
1

我想組這樣的結果:SQL組按日期查詢

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 

逼到

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

是有辦法組一個結果只用日期?

當前查詢:

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

將'CAST(N.Created AS DATE)'添加到'GROUP BY'子句中... –

+1

爲什麼日期「2016-09-19」和「2016-08-29」從查詢結果中排除? –

+0

我需要最近的 – Ozzman1893

回答

2

你只是想最近的記錄?

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 

如果你需要找到每個Table1FK1組的最新記錄再考慮使用分析功能:

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; 

我在事件中使用RANK而不是在這裏ROW_NUMBER兩個或更多的記錄可能會被綁定爲最新的記錄。在這種情況下,上述查詢將返回所有關係。

0

我建議使用ROW_NUMBER(),因爲如果要求是超過1 FK1,或者您需要一個OFFSET那麼它不能與TOP來完成:

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 

這是動態返回所有FK1存在的最近記錄