2015-06-01 39 views
4

我使用SQL Server和有一個表,設置如下圖所示:SQL查詢,以便用不同的主題選擇最新的記錄

| id | subject | content | moreContent | modified | 
| 1 | subj1 | aaaa | aaaaaaaaaaa | 03/03/2015 | 
| 2 | subj1 | bbbb | aaaaaaaaaaa | 03/05/2015 | 
| 3 | subj2 | cccc | aaaaaaaaaaa | 03/03/2015 | 
| 4 | subj1 | dddd | aaaaaaaaaaa | 03/01/2015 | 
| 5 | subj2 | eeee | aaaaaaaaaaa | 07/02/2015 | 

我想選擇每個主題詞的最新記錄,所以記錄要返回是:

| id | subject | content | moreContent | modified | 
| 2 | subj1 | bbbb | aaaaaaaaaaa | 03/05/2015 | 
| 3 | subj2 | cccc | aaaaaaaaaaa | 03/03/2015 | 


SELECT Subject, MAX(Modified) FROM [CareManagement].[dbo].[Careplans] GROUP BY Subject 

我可以做類似上面的查詢,但我想保留的所有內容從選定行。要返回內容列,我需要應用一個聚合函數,或將它們添加到group by子句中,這不會給我所需的效果。 我也看過嵌套查詢,但還沒有找到一個成功的解決方案。如果任何人都可以提供幫助,那會很棒。

回答

3

您可以使用ROW_NUMBER()

SELECT id, subject, content, moreContent, modified 
FROM (
    SELECT id, subject, content, moreContent, modified, 
      ROW_NUMBER() OVER (PARTITION BY subject 
          ORDER BY modified DESC) AS rn 
    FROM [CareManagement].[dbo].[Careplans]) t 
WHERE rn = 1 

rn = 1將返回其每subject最新modified日期每一條記錄。如果有兩個或更多記錄共享相同的「最新」日期,並且您希望返回這些記錄的所有,那麼您可能會看到RANK()窗口函數。

1

使用ROW_NUMBER這變得非常簡單。

with myCTE as 
(
    select id 
     , Subject 
     , content 
     , morecontent 
     , Modified 
     , ROW_NUMBER() over (PARTITION BY [Subject] order by Modified desc) as RowNum 
    from [CareManagement].[dbo].[Careplans] 
) 

select id 
    , Subject 
    , content 
    , morecontent 
    , Modified 
from myCTE 
where RowNum = 1 
1

您可以使用rank窗函數只檢索最新記錄:

SELECT id, subject, content, moreContent, modified 
FROM (SELECT id, subject, content, moreContent, modified, 
       RANK() OVER (PARTITION BY subject ORDER BY modified DESC) AS rk 
     FROM [CareManagement].[dbo].[Careplans]) t 
WHERE rk = 1