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

相關問題