2017-08-18 28 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