2017-08-18 16 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'を削除すると、重複する名前/ IDはもう表示されません。(ただしコメントはありません)

ご存知ですか?

+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 
関連する問題