#sql-server #tsql #group-by #dense-rank
#sql-сервер #tsql #группировать по #плотный ранг
Вопрос:
Мне нужно добавить числовую группировку или ранжирование к набору данных для последующего использования. Я изо всех сил пытаюсь получить номера групп, как они мне нужны.
Вот некоторые примеры данных:
create table #TVShow (
TV varchar(20),
Show varchar(20),
Channel varchar(20),
[Time] time)
insert into #TVShow
values ('Samsung', 'The Office', 'Bravo', '07:00:00'),
('Samsung', 'The Office', 'Bravo', '07:30:00'),
('Samsung', 'The Office', 'Bravo', '08:00:00'),
('Samsung', 'The Office', 'Bravo', '08:30:00'),
('Samsung', 'The Office', 'TBS', '09:00:00'),
('Samsung', 'The Office', 'TBS', '09:30:00'),
('Samsung', 'The Office', 'MTV', '10:00:00'),
('Samsung', 'The Office', 'Bravo', '10:30:00'),
('Samsung', 'The Office', 'Bravo', '11:00:00'),
('Samsung', 'The Office', 'TBS', '11:30:00'),
('Samsung', 'Below Deck', 'TBS', '07:00:00'),
('Samsung', 'Below Deck', 'TBS', '07:30:00'),
('Samsung', 'Below Deck', 'Bravo', '09:00:00'),
('Samsung', 'Below Deck', 'Bravo', '09:30:00'),
('Samsung', 'Below Deck', 'Discovery', '10:00:00'),
('LG', 'The Office', 'Bravo', '07:00:00'),
('LG', 'The Office', 'Bravo', '07:30:00'),
('LG', 'The Office', 'Bravo', '08:00:00'),
('LG', 'The Office', 'Bravo', '08:30:00'),
('LG', 'The Office', 'TBS', '09:00:00'),
('LG', 'The Office', 'TBS', '09:30:00'),
('LG', 'The Office', 'MTV', '10:00:00'),
('LG', 'The Office', 'Bravo', '10:30:00'),
('LG', 'The Office', 'Bravo', '11:00:00'),
('LG', 'The Office', 'TBS', '11:30:00'),
('LG', 'Below Deck', 'TBS', '07:00:00'),
('LG', 'Below Deck', 'TBS', '07:30:00'),
('LG', 'Below Deck', 'Bravo', '09:00:00'),
('LG', 'Below Deck', 'Bravo', '09:30:00'),
('LG', 'Below Deck', 'Discovery', '10:00:00')
Вот мой желаемый результат
Я ищу группу по телевизору, шоу и каналу в порядке возрастания [Time]. Каждая группа (начиная с 1) будет увеличиваться на 1 при изменении канала и перезапускает счетчик обратно на 1, если шоу и / или ТВ меняются.
Я пробовал несколько вариантов dense_rank()
, например,
select TV,
Show,
Channel,
[Time],
Num = dense_rank() over (partition by TV, Show, Channel order by TV, Show, [Time])
from #TVShow
Но не могу понять, как мне это нужно. Любая помощь была бы отличной. Спасибо!
Комментарии:
1. Не просто покажите нам ожидаемые результаты, объясните логику.
2. Порядок по каналу, а не по времени
Ответ №1:
Если я предполагаю, что ваша логика верна, вы хотите увеличивать значение каждый раз, когда канал меняется для определенного шоу и телевизора. Одним из методов было бы использование LAG
для получения значения предыдущей строки, а затем оконного кумулятивного условия COUNT
:
WITH CTE AS(
SELECT TV,
Show,
Channel,
[Time],
LAG(Channel) OVER (PARTITION BY TV, Show ORDER BY Time) AS PreviousChannel
FROM #TVShow)
SELECT TV,
Show,
Channel,
[Time],
COUNT(CASE WHEN Channel != PreviousChannel THEN 1 END) OVER (PARTITION BY TV, Show
ORDER BY [Time] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 1 AS Num
FROM CTE;
Комментарии:
1. Приношу свои извинения. Я отправил свой вопрос заранее, но, похоже, вы получили именно тот результат, который я искал. Очень признателен!