2011-09-13 34 views
3
一天

我有三列如何選擇由

用戶ID表,計數,最大數量的用戶,日期

我希望能夠選擇爲每個最高計數的用戶ID日期。

我已經嘗試了使用內聯select語句查詢的幾個不同變體,但沒有一個100%工作,我不喜歡有三個內聯選擇的選擇。

正在做內聯選擇不使用臨時表的唯一方法嗎?什麼是解決這個問題的最好方法?

+0

哪個SQL Server版本? –

+0

Microsoft SQL Server 2008 R2(RTM) - 10.50.1600.1 –

+0

日期列是'DATE'還是'DATETIME'?如果後者有時間組件? –

回答

1

如果[日期]事實上是一個[日期]柱沒有時間分量:

;WITH x AS 
(
    SELECT [Date], [Count], UserID, rn = ROW_NUMBER() OVER 
    (PARTITION BY [Date] ORDER BY [Count] DESC) 
    FROM dbo.table 
) 
SELECT [Date], [Count], UserID 
FROM x 
WHERE rn = 1 
ORDER BY [Date]; 

如果[Date]DATETIME柱上用的時間成分,則:

;WITH x AS 
(
    SELECT [Date] = DATEADD(DAY, DATEDIFF(DAY, '19000101', [Date]), '19000101'), 
    [Count], UserID, rn = ROW_NUMBER() OVER 
    (PARTITION BY DATEADD(DAY, DATEDIFF(DAY, '19000101', [Date]), '19000101') 
     ORDER BY [Count] DESC) 
    FROM dbo.table 
) 
SELECT [Date], [Count], UserID 
FROM x 
WHERE rn = 1 
ORDER BY [Date]; 

如果您想在平局的情況下選擇特定的一排,您可以在平局內爲ORDER BY添加一個平局球。如果要在綁定中包含多行,則可以嘗試將ROW_NUMBER()更改爲DENSE_RANK()

0

爲SQL 2K5

select UserID, Count, Date 
from tb 
where Rank() over (partition by Date order by Count DESC, UserID DESC) = 1 
+0

+1的排名功能 - 比相關的子查詢快得多。 –

+2

實際上並不工作......「窗口函數只能出現在SELECT或ORDER BY子句中。您仍然必須使用派生表 – Tahbaza

+0

...或公用表表達式。雖然我們在此,但我更喜歡使用'ROW_NUMBER',因爲沒有任何關係的可能性。 –

2

此解決方案讓你的多條記錄,如果有在計數的領帶,但是應該工作。

SELECT a.Date, a.UserId, a.[Count] 
FROM yourTable a INNER JOIN (
    SELECT MAX([Count]) as [Count], Date 
    FROM yourTable 
    GROUP BY Date 
) b ON a.[Count] = b.[Count] AND a.Date = b.Date 
ORDER BY a.Date 
+0

您可能需要執行一些轉換和/或範圍檢查日期,除非它真的是沒有時間的'DATE'列。 –

+0

好處,此解決方案假定日期列中沒有時間分量 – Tahbaza

1
SELECT x.* 
FROM (
    SELECT Date 
    FROM atable 
    GROUP BY Date 
) t 
CROSS APPLY (
    SELECT TOP 1 WITH TIES 
    UserID, Count, Date 
    FROM atable 
    WHERE Date = t.Date 
    ORDER BY Count DESC 
) x 

如果Datedatetime類型,並且可以具有一個非零時間組件,改變t表是這樣的:

… 
FROM (
    SELECT Date = DATEADD(DAY, DATEDIFF(DAY, 0, Date), 0) 
    FROM atable 
    GROUP BY DATEADD(DAY, DATEDIFF(DAY, 0, Date), 0) 
) t 
… 

參考文獻: