T-SQL — добавление числовой группировки

#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. Приношу свои извинения. Я отправил свой вопрос заранее, но, похоже, вы получили именно тот результат, который я искал. Очень признателен!