SQL Server查询按列中的最大值分组

时间:2009-05-26 00:33:04

标签: sql sql-server-2005 tsql sql-server-2008

****更新:**

使用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)

3 个答案:

答案 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

此查询使用中间输出来构建最终输出 这有帮助吗?