【发布时间】:2009-05-26 00:33:04
【问题描述】:
****更新:**
使用 MS SQL Server 2005 中可用的 Rank() over partition 语法确实为我指明了正确的方向,它(或者我应该写“I”)无法给我需要的结果求助于枚举代码中的行。
例如,如果我们选择 TOP (1) of rank,我只会得到一个值,即 slot 1。如果我使用 MAX(),那么我会得到每个 slot 的 top rank 值。 .在我的情况下,它不起作用,因为如果插槽 2 的顶部值为 NULL,但它旁边的 MAX 值是非空的,那就是我想要的。
因此,无法找到完整的 T-SQL 解决方案,我只好在 SQL 中尽可能多地进行过滤,然后在客户端的代码中枚举结果。
原文:
我一直在访问advanced T-SQL books、StackOverflow 和 google,试图弄清楚如何使用数据透视或使用分析函数来处理此查询。到目前为止,我还没有找到正确的组合。
我有排序的时间表(更高的价值,更大的优先级)。每个时间表都有一个播放列表,其中包含一定数量的带有文件的编号插槽。
我需要做的,是将所有时间表及其关联的播放列表排列起来,并为每个时段,从时间表中获取具有最高排名值的文件。
所以,如果我有一个特定客户的查询,其中播放列表和时间表之间有连接,按 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)
【问题讨论】:
-
+1 只是因为很高兴偶尔看到一个正确提出的问题,以及所有相关的表格和所有 -- 谢谢!!!-)
-
顺便说一句,pivot 与它没有多大关系(这是关于“翻转”事物,因此行值变成列)所以我正在相应地进行编辑。
-
我不确定您所指的书是否好。试试这些:sql.co.il
标签: sql sql-server-2005 tsql sql-server-2008