![](/img/trans.png)
[英]How to add column in table grouped by value and max value in date column using sql query?
[英]SQL Server query grouped by max value in column
****更新:**
使用MS SQL Server 2005中可用的Rank()over分區語法確實指向了正確的方向,它(或者我應該寫“I”)無法向我提供我需要的結果而無需在代碼中枚舉行。
例如,如果我們選擇排名的TOP(1),我只得到一個值,即插槽1.如果我使用MAX(),那么我得到每個插槽的排名最高的值...在我的情況下,不起作用,因為如果插槽2的頂部值為NULL,但它旁邊的MAX值是非空的,那就是我想要的那個。
因此,無法找到完全的T-SQL解決方案,我在SQL中盡可能地使用過濾,然后在客戶端的代碼中枚舉結果。
原版的:
我一直在使用先進的T-SQL書籍 ,StackOverflow和谷歌試圖通過使用樞軸或使用分析函數來弄清楚如何處理這個查詢。 到目前為止,我還沒有找到合適的組合。
我有排名的時間表(更高的值,更高的優先級)。 每個時間表都有一個帶有文件的一定數量編號插槽的播放列表。
我需要做的是排隊所有的時間表及其相關的播放列表,並且對於每個插槽,從具有最高排名值的時間表中獲取文件。
所以,如果我通過播放列表和日程表之間的連接查詢特定客戶,請按Schedule.Rank DESC排序,如下所示:
PlaylistId Schedule.Rank SlotNumber FileId
100 100 1 1001
100 100 2 NULL
100 100 3 NULL
200 80 1 1101
200 80 2 NULL
200 80 3 NULL
300 60 1 1201
300 60 2 NULL
300 60 3 2202
400 20 1 1301
400 20 2 2301
400 20 3 NULL
從這里,我需要為每個槽號的MAX排序行找到FileId:
SlotNumber FileId Schedule.Rank
1 1001 100
2 2301 20
3 2202 60
關於如何做到這一點的任何想法?
表定義如下:
CREATE TABLE dbo.Playlists(
id int NOT NULL)
CREATE TABLE dbo.Customers(
id int NOT NULL,
name nchar(10) NULL)
CREATE TABLE dbo.Schedules(
id int NOT NULL,
rank int NOT NULL,
playlistid int NULL,
customerid int NULL)
CREATE TABLE dbo.PlaylistSlots(
id int NOT NULL,
slotnumber int NOT NULL,
playlistid int NULL,
fileid int NULL)
SELECT slotnumber, fileid, rank
FROM
(
SELECT slotnumber, fileid, Schedules.rank, RANK() OVER (PARTITION BY slotnumber ORDER BY Schedules.rank DESC) as rankfunc
FROM Schedules
INNER JOIN PlaylistSlots ON Schedules.playlistid = PlaylistSlots.playlistid
) tmp
WHERE rankfunc = 1
您是否看過SQL Server(2005年起)的PARTITION和RANK功能?
select SlotNumber, FileId, ScheduleRank
FROM intermediateTable a,
(
SELECT SlotNumber, Max(Schedule.Rank) as MaxRank
FROM intermediateTable O
WHERE FileId is not null GROUP BY SlotNumber) b
WHERE b.SlotNumber = a.SlotNumber and b.MaxRank = a.Rank
此查詢使用中間輸出來構建最終輸出。
這有幫助嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.