**** Обновление: **
использование синтаксиса 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)