2009-05-26 2 views
6

**** Обновление: **SQL Server сгруппированных на максимальное значение в колонке

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

Например, если мы выбираем TOP (1) ранга, я получаю только одно значение, т. Е. Слот 1. Если я использую MAX(), тогда я получаю наивысшее ранжированное значение для каждого слота. . В моем случае это не работает, потому что если верхнее значение слота 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 

От этого мне нужно найти 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) 
+0

+1 только потому, что это так приятно видеть правильно заданный вопрос раз в то время, со всеми соответствующими таблицами и всеми - спасибо !!!) –

+0

BTW, pivot не имеет ничего общего с этим (это о «переворачивании» вещей, поэтому значения строк становятся столбцами), поэтому я редактирую соответственно. –

+0

Я не уверен, что книга, о которой идет речь, хороша. Попробуйте следующее: http://www.sql.co.il/ –

ответ

4
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 
+0

, в то время как этот ответ не совсем корректен (функция окна в критериях вызывает ошибку), корни этого ответа привели меня к моему конкретному ответу на реализацию. –

+0

, так что, пожалуйста, разместите точно верную версию (или скажите мне, как отредактировать мой)? как я упомянул в комментарии к ответу @ mitch, я не мог проверить это, поэтому некоторые (надеюсь, незначительные!) ошибки вполне могли проникнуть - спасибо! –

+0

все еще работает над решением, но чтобы исправить проблему с оконной функцией, вы можете обернуть весь выбор в производной таблице. Я все еще не получаю результаты, которые мне нужны, но я направляюсь в правильном направлении. Когда у меня будет рабочее решение, я отредактирую исходный вопрос с полным ответом. –

1

Вы смотрели на SQL Server (2005 г.) PARTITION and RANK особенности?

+0

Я читал о тех, кто находится на SO и в документах MSDN .... но не смог успешно использовать их на этом этапе. –

+0

Они идеально подходят для проблемы, о которой вы говорили. –

+0

Yep - Я был занят набором краткого кода для решения на основе разделов, даже когда ваш ответ наступил, @Mitch (надеюсь, что это правильно, нет времени проверять, извините). Итак, как общая проблема SO, что лучше всего - научить Тодда ловить рыбу, как вы делаете, или пытаться дать ему рыбу, как я делаю? Не риторический вопрос, я здесь довольно новый и пытаюсь узнать стиль SO, видя, что делают старые таймеры, но, похоже, оба подхода довольно популярны - tx для любой обратной связи! –

0
 

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 
 

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

+0

IMHO действительно важно, чтобы также демонстрируют подходы, которые переносятся на другие двигатели SQL без характеристик ранга и раздела, как и ваши, но я не вижу, где формируется промежуточная таблица или как: можете ли вы отредактировать ответ yr для полноты? ТХ! –

+0

Промежуточная таблица представляет собой таблицу 1, данную ОП – shahkalpesh

Смежные вопросы