2017-08-18 137 views
-2

我只想從我的數據庫中選擇最新的輸入。SQL - 在NVARCHAR列中選擇最新的最大日期

目前,它總是給我,即使我使用的查詢

SELECT 
    A.[Id], 
    UD.[Name], 
    MAX(CONVERT(DATE, AN.[PostedOn])) 'date', 
    CAST(AN.[Content] AS NVARCHAR(MAX)) 'comment' 
FROM 
    [dbo].[Account] A 
LEFT JOIN 
    [dbo].[UserData] UD ON A.[UserId] = UD.UserId 
LEFT JOIN 
    [dbo].[Note] AN ON UD.[UserId] = AN.[CustomerID] 
GROUP BY 
    A.[Id], UD.[Name], CAST(AN.[Content] AS NVARCHAR(MAX)) 

當前結果

+---------+------------------------+------------+-------+ 
|id  |Name     |Date  |Comment| 
+---------+------------------------+------------+-------+ 
|01  |John     |2017-08-15 |Blue | 
|01  |John     |2017-07-10 |Green | 
|02  |Bob      |2017-07-15 |Green | 
|02  |Bob      |2017-06-05 |Red | 
|03  |Eric     |2017-08-15 |Yellow | 
|04  |Karl     |2017-08-15 |NULL | 
|04  |Karl     |2017-06-10 |Black | 
+---------+------------------------+------------+-------+ 

預期/所需結果的最大

簡體版過濾所有評論:

+---------+------------------------+------------+-------+ 
|id  |Name     |Date  |Comment| 
+---------+------------------------+------------+-------+ 
|01  |John     |2017-08-15 |Blue | 
|02  |Bob      |2017-07-15 |Green | 
|03  |Eric     |2017-08-15 |Yellow | 
|04  |Karl     |2017-08-15 |NULL | 
+---------+------------------------+------------+-------+ 

FYI如果我從查詢中刪除CAST(AN.[Content] AS NVARCHAR(MAX)) 'comment',然後我看不出「重複」名稱/標識了(但當時沒有發表評論)

任何想法?

+2

標記您正在使用的dbms,有些產品細節... – jarlh

回答

0

使用ROW_NUMBER()

SELECT t.* 
FROM (SELECT . . ., 
      ROW_NUMBER() OVER (PARTITION BY A.id ORDER BY convert(date, AN.[PostedOn]) DESC) as seqnum 
     FROM [dbo].[Account] A LEFT JOIN 
      [dbo].[UserData] UD 
      ON A.[UserId] = UD.UserId LEFT JOIN 
      [dbo].[Note] AN 
      ON UD.[UserId] = AN.[CustomerID] 
    ) t 
WHERE seqnum = 1; 

. . .是要列的列表。

作爲說明:您的查詢不是過濾的最大值。您的查詢正在使用聚合查詢計算最大值。理解過濾和聚合之間的區別很重要。

0
SELECT 
    t.id, t.Name, t.date, t.Comment 
FROM 
(
    SELECT A.id, UD.Name, CONVERT(date, AN.[PostedOn]) AS date, t.Comment, 
     ROW_NUMBER() OVER (PARTITION by t.id 
          ORDER BY CONVERT(date, AN.[PostedOn]) DESC) rn 
    FROM [dbo].[Account] A 
    LEFT JOIN [dbo].[UserData] UD 
     ON A.[UserId] = UD.UserId 
    LEFT JOIN [dbo].[Note] AN 
     ON UD.[UserId] = AN.[CustomerID] 
) t 
WHERE t.rn = 1 
相關問題