簡體   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