web-dev-qa-db-ja.com

別の列も同じ場合にのみ、ROW_NUMBER()OVER / PARTITION BYを使用できますか?

私はこのコードを使用しています:(この質問から: SQLでグループごとに最後のレコードを取得する方法 自分の列を置き換える)

WITH e AS
(
 SELECT *,
     ROW_NUMBER() OVER
     (
         PARTITION BY ApplicationId
         ORDER BY theDate DESC
     ) AS Recency
 FROM [Event]
)
SELECT *
FROM e
WHERE Recency = 1

2つのフィールドが同じ場合にのみ「分割」できますか?たとえば、次のようなデータがあります。

ID      Name    theDate
123     John    01/01/2012
123     John    01/02/2012
123     Doe     01/01/2012
456     Smith   02/04/2012
789     Smith   02/01/2012
789     Smith   02/09/2012
789     Roger   02/08/2012

そのデータから私は返したい:

ID      Name    theDate
123     John    01/02/2012
123     Doe     01/01/2012
456     Smith   02/04/2012
789     Smith   02/09/2012
789     Roger   02/08/2012

助けてくれてありがとう。

トーマス

13
tsdexter

私はそれをここで答えを見つけました: 2列を使用したテーブル分割

1つの列でのみパーティション化できますが、次のようにその列を生成して「複数のパーティション」を作成できます。

WITH e AS 
( 
 SELECT *, 
 ROW_NUMBER() OVER 
 ( 
     PARTITION BY CONVERT(VARCHAR(100),ApplicationId) + ' ' + Name
     ORDER BY theDate DESC 
 ) AS Recency 
 FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 

2つの列を1つの文字列として一緒に追加すると、両方の列が同一の場合にのみ分割されます。

3
tsdexter

複数の列をコンマで区切ることができます

WITH e AS 
( 
 SELECT *, 
     ROW_NUMBER() OVER 
     ( 
         PARTITION BY ApplicationId , Name
         ORDER BY theDate DESC 
     ) AS Recency 
 FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 
32
JeffO