****更新:**
使用MS SQL Server 2005中可用的Rank()over分区语法确实指向了正确的方向,它(或者我应该写“I”)无法给我我需要的结果求助于在代码中枚举行。
例如,如果我们选择排名的TOP(1),我只得到一个值,即插槽1.如果我使用MAX(),那么我得到每个插槽的排名最高的值。 .which,在我的情况下,不起作用,因为如果插槽2的顶部值为NULL,但它旁边的MAX值是非空的,那就是我想要的那个。
因此,无法找到完整的T-SQL解决方案,我已尽可能在SQL中进行过滤,然后在客户端的代码中枚举结果。
原件:
我一直在点击advanced T-SQL books,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)
答案 0 :(得分:4)
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
答案 1 :(得分:1)
您是否查看了SQL Server(2005年以后)PARTITION and RANK功能?
答案 2 :(得分:0)
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
此查询使用中间输出来构建最终输出 这有帮助吗?