Запрос SQL Server сгруппирован по максимальному значению в столбце - PullRequest
6 голосов
/ 26 мая 2009

**** Обновление: **

использование синтаксиса Rank () для раздела, доступного в MS SQL Server 2005, действительно указывает мне верное направление, оно (или, возможно, я должен написать «I») не может дать мне нужные результаты без прибегая к перечислению строк в коде.

Например, если мы выберем TOP (1) ранга, я получу только одно значение, т. Е. Слот 1. Если я использую MAX (), то я получу значение верхнего ранга для каждого слота .. . который, в моем случае, не работает, потому что если верхнее значение слота 2 равно NULL, но оно рядом со значением MAX не пусто, то это то, что я хочу.

Поэтому, не найдя полностью решения T-SQL, я прибегнул к максимально возможной фильтрации в SQL, а затем перечислил результаты в коде на стороне клиента.

Оригинал:

Я нажимаю продвинутые книги по T-SQL , 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

Исходя из этого, мне нужно найти FileId для строки с рейтингом MAX на номер слота:

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 ]

4 голосов
/ 26 мая 2009
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 голос
/ 26 мая 2009

Рассматривали ли вы функции SQL Server (начиная с 2005 года) PARTITION и RANK ?

0 голосов
/ 26 мая 2009

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

Этот запрос использует промежуточный вывод для построения окончательного вывода.
Это помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...