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;
我需要为一组数据添加数字分组或排名以备后用。我正在努力获取我需要的群组号码。
下面是一些示例数据:
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;