我有三列如何選擇由
用戶ID表,計數,最大數量的用戶,日期
我希望能夠選擇爲每個最高計數的用戶ID日期。
我已經嘗試了使用內聯select語句查詢的幾個不同變體,但沒有一個100%工作,我不喜歡有三個內聯選擇的選擇。
正在做內聯選擇不使用臨時表的唯一方法嗎?什麼是解決這個問題的最好方法?
我有三列如何選擇由
用戶ID表,計數,最大數量的用戶,日期
我希望能夠選擇爲每個最高計數的用戶ID日期。
我已經嘗試了使用內聯select語句查詢的幾個不同變體,但沒有一個100%工作,我不喜歡有三個內聯選擇的選擇。
正在做內聯選擇不使用臨時表的唯一方法嗎?什麼是解決這個問題的最好方法?
如果[日期]事實上是一個[日期]柱沒有時間分量:
;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()
。
爲SQL 2K5
select UserID, Count, Date
from tb
where Rank() over (partition by Date order by Count DESC, UserID DESC) = 1
+1的排名功能 - 比相關的子查詢快得多。 –
實際上並不工作......「窗口函數只能出現在SELECT或ORDER BY子句中。您仍然必須使用派生表 – Tahbaza
...或公用表表達式。雖然我們在此,但我更喜歡使用'ROW_NUMBER',因爲沒有任何關係的可能性。 –
此解決方案讓你的多條記錄,如果有在計數的領帶,但是應該工作。
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
您可能需要執行一些轉換和/或範圍檢查日期,除非它真的是沒有時間的'DATE'列。 –
好處,此解決方案假定日期列中沒有時間分量 – Tahbaza
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
如果Date
是datetime
類型,並且可以具有一個非零時間組件,改變t
表是這樣的:
…
FROM (
SELECT Date = DATEADD(DAY, DATEDIFF(DAY, 0, Date), 0)
FROM atable
GROUP BY DATEADD(DAY, DATEDIFF(DAY, 0, Date), 0)
) t
…
參考文獻:
哪個SQL Server版本? –
Microsoft SQL Server 2008 R2(RTM) - 10.50.1600.1 –
日期列是'DATE'還是'DATETIME'?如果後者有時間組件? –