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

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

****更新:**

在 MS SQL Server 2005 中使用 Rank() over partition 语法确实为我指明了正确的方向,它(或者我应该写“I”)无法在不诉诸代码中枚举行的情况下给我我需要的结果.

例如,如果我们选择 TOP (1) of rank,我只会得到一个值,即 slot 1。如果我使用 MAX(),那么我会得到每个 slot 的最高排名值……在我的情况下, 不起作用,因为如果插槽 2 的最高值是 NULL,但它旁边的 MAX 值是非空的,这就是我想要的。

因此,无法找到完整的 T-SQL 解决方案,我尽可能多地在 SQL 中进行过滤,然后在客户端的代码中枚举结果。

原来的:

我一直在打 advanced T-SQL books 、StackOverflow 和 google 试图弄清楚如何通过使用枢轴或使用分析函数来处理此查询。到目前为止,我还没有找到正确的组合。

我有排名的时间表(更高的值(value),更高的优先级)。每个时间表都有一个播放列表,其中包含一定数量的带有文件的编号插槽。

我需要做的是排列所有时间表及其相关的播放列表,对于每个插槽,从具有最高排名值的时间表中获取文件。

因此,如果我对播放列表和日程表之间有连接的特定客户进行查询,按 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

由此,我需要为每个 slotnumber 的 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 查询按列中的最大值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/908472/

相关文章:

python - "Join"同表内

sql - 独特的前 5 名随机查询

asp.net - 将整个数据集传递给 MSSQL 2005 中的存储过程

sql - SQL Server 存储过程/查询的解释

sql-server - 找不到数据类型 bool 值

sql - 在日期时间范围内加速连接表的最佳实践

php - 如何将sql对象转换为多维数组?

sql - 获取忽略 Null 或零值的 AVG

tsql - 如何在 WHILE EXISTS() 循环中分配变量

c# - SQLCLR 和 DateTime2