如果 SQL 服务器中只有序列形式,我想计算名称列中的值

I want to count values in name column if there are only in sequence form in SQL Server

create table #t (Id int, Name nvarchar(max))    

insert into #t 
values (1, 'ABC'), (2, 'ABC'), (3, 'BBB'), (4, 'BBB'),  
       (5, 'BBB'), (6, 'BBB'), (7, 'CCC'), (8, 'BBB'),  
       (9, 'BBB'), (10, 'ABC')

如果只有序列形式,我想统计名称列中的值 我如何获得此结果,如下面 table 所示:

| Name | Repetition |   
('ABC'),    2
('ABC'),    2
('BBB'),    4
('BBB'),    4
('BBB'),    4
('BBB'),    4
('CCC'),    1
('BBB'),    2
('BBB'),    2
('ABC'),    1

试试这个多 cte 解决方案:

;with name_change as (
  select *, case when name=lag(name, 1) over (order by id) then 0 else 1 end as indicator 
  from t
), name_group as (
  select name, sum(indicator) over (order by id) as g 
  from name_change
)
select name, count(name) over (partition by g) from name_group

尽管不确定效率如何,但我认为它可以满足您的需求...

SQLFiddle

您也可以尝试像下面这样计算连续行的间隙和孤岛类型方法

See live demo

select 
    Name, 
    Repetition= count(1) over(  partition by r,Name )
from 
(
    select 
    *, 
    r=id-row_number() over(partition by Name order by Id) 
    from #t
 ) t
order by id