繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM