T-SQL - 添加一个数字分组

T-SQL - Adding a numerical grouping

我需要为一组数据添加数字分组或排名以备后用。我正在努力获取我需要的群组号码。

下面是一些示例数据:

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')

这是我想要的结果

我希望按 [时间] 升序按电视、节目和频道分组。每个组(从 1 开始)将在频道更改时递增 1,如果节目 and/or 电视更改,将从 1 重新开始计数。

我尝试了 dense_rank() 的几种变体,例如,

select TV,
    Show,
    Channel,
    [Time],
    Num = dense_rank() over (partition by TV, Show, Channel order by TV, Show, [Time])
from #TVShow

但无法满足我的需要。任何帮助都会很棒。谢谢!

如果我假设您的逻辑正确,您希望每次频道针对特定节目和电视更改时增加该值。一种方法是使用 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;