13

我使用此代码:(从这样一个问题:How to get the last record per group in SQL代我自己列)只有当另一列也相同时才可以使用ROW_NUMBER()OVER/PARTITION BY?

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 

感谢您的帮助。

托马斯

+0

相同的答案,所以推迟到最早的 – 2012-04-18 01:50:22

+0

这必须是功课。 – JeffO 2012-05-02 16:35:00

+0

@JeffO nope ...我只是尝试不粘贴客户端数据,当我可以帮助它。 – tsdexter 2012-08-03 20:32:19

回答

4

,我找到了答案在这里分开:Table partitioning using 2 columns

只能对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

我认为你将'table partitioning'与'PARTITION BY'混淆 - 虽然它们的命名方式相似,但它们之间没有任何关系。你当然不限于'PARTITION BY'中的一个列或表达式,并且不需要你所谓的'多分区'... – 2012-04-18 02:24:17

+0

@AaronBertrand是的,我意识到我发布的链接是关于表分区的,然而,使用PARTITION BY的那个人回答那个问题的人说的也适用于这里。上面的建议(field1,field2)不能用来返回我需要的数据,而我提供的代码在链接(Field1 +''+ Field2)中不提供答案确实提供了正确的数据... Is这不是正确的方法吗? – tsdexter 2012-04-18 02:28:23

+0

@AaronBertrand我没有完全测试结果,但我认为PARTITION BY field1,field2第一个分区在第一个字段,然后进一步分区在第二个字段,结果是正确的?这不是我需要的。 – tsdexter 2012-04-18 02:30:31

30

可以有多个列由逗号

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 
+0

你试过吗? Over(http://msdn.microsoft.com/en-us/library/ms189461.aspx)的文档不清楚您可以指定多少个列。 – 000 2012-04-18 01:57:42

+0

这不符合预期。它仍然将所有具有相同ID的分区分开,然后我假设基于第二列的更多分区。看到我添加的答案。 – tsdexter 2012-04-18 02:08:16

+2

+1。这完全按照预期工作,并提供您在问题中要求的确切答案。如果没有,你需要解释如何。我怀疑你实际上没有对它进行测试,因为你对它不起作用的描述与实际做的不一致。 – 2012-04-18 02:37:38

相关问题