仅当另一列也相同时,是否可以使用 ROW_NUMBER() OVER/PARTITION BY?

21

我正在使用以下代码: (来自这个问题: 如何在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

如果两个字段相同,是否可以进行“分区”?例如,我有以下数据:

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

感谢任何帮助。

Thomas


相同的答案,因此推迟到最早的答案。 - John Dewey
1
@JeffO 不是...我只是尽量避免粘贴客户数据。 - tsdexter
在我看来,这似乎可以使用 MAX(theDate)GROUP BY ID, Name 来完成。 - Sean
2个回答

48

你可以用逗号分隔多个列

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 

你试过了吗?Over函数的文档(http://msdn.microsoft.com/en-us/library/ms189461.aspx)并没有明确说明你可以指定多少列。 - 000
这个并没有按照预期工作。它仍然将所有具有相同ID的内容进行分区,然后我想根据第二列进一步分区。请查看我添加的答案。 - tsdexter
4
这个功能完全按照预期工作,并且提供了你在问题中询问的确切答案。如果它没有按照预期工作,你需要解释一下具体哪里出了问题。我怀疑你实际上没有做过测试,因为你对于它没有按预期工作的描述与它实际上的表现不符。 - Aaron Bertrand
2
我赞同@AaronBertrand的评论。我在许多情况下都使用了多列PARTITION BY。JeffO的例子恰好是我所使用的。 - Steve Stedman

5
我在这里找到了答案:使用两个列进行表分区 您只能在一个列上进行分区,但该列可以生成以创建“多个分区”,如下所示:
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 

将这两列合并为一个字符串,只有当这两列完全相同时才进行分区。

3
我认为你把“表分区”和“PARTITION BY”混淆了 - 尽管它们的名称相似,但它们没有任何关联。在“PARTITION BY”中,你当然不仅限于一个列或表达式,并且根本不需要你所谓的“多重分区”。 - Aaron Bertrand
1
@AaronBertrand 是的,我知道我发布的链接是关于表分区的,而我正在使用PARTITION BY,但是回答那个问题的人所说的也适用于这里。上面的建议(field1,field2)无法按我需要的方式返回数据,而我提供的代码基于链接中的答案(Field1 + ' '+ Field2)确实提供了正确的数据...这不是正确的方法吗? - tsdexter
1
@AaronBertrand 我没有完全测试结果,但我认为PARTITION BY field1,field2首先在第一个字段上进行分区,然后在第二个字段上进一步分区,这是正确的吗?那不是我需要的。 - tsdexter
1
在开始对其进行假设之前,您需要测试结果。您尝试过@Jeff O的答案吗?您能解释一下它为什么没有按预期工作吗?我使用您的示例数据尝试了他的代码,并且它给出了您要求的完全理想的结果(尽管顺序不正确)。 - Aaron Bertrand
1
嗯,我的错误。肯定是其他原因导致了差异,但它在我真实的数据上没有起作用,这些数据由于涉及雇主的机密而未公开发布。这是我的错误,没有发布准确的数据/列。在这种情况下,我不确定差异来自哪里,但我已经使用我的数据进行了测试,结果并不正确。 - tsdexter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接