Получить уникальный номер строки для того же флага, когда он изменится на другой флаг в следующей строке? - PullRequest
2 голосов
/ 06 января 2020

Я новичок в T-SQL.

Может кто-нибудь, пожалуйста, помогите мне получить это?

У меня есть следующие данные:

Id  flg  rnum
--------------
11  n   1
11  n   2
11  y   3
11  n   4
11  n   5
11  y   6
11  n   7

Я хочу получить уникальный номер строки для того же флага, когда он меняется на другой флаг в следующей строке.

Желаемый результат:

Id  flg  rnum ranks
-------------------
11  n   1    1
11  n   2    1
11  y   3    2
11  n   4    3
11  n   5    3
11  y   6    4  
11  n   7    5

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Вы можете использовать LAG() OVER ([ PARTITION BY .. ] ORDER BY...) оконную аналитику c вместе с другой аналитикой c функцию SUM() OVER ([ PARTITION BY .. ] ORDER BY...):

WITH T2 AS
(
SELECT *, LAG(flg,1) OVER ( ORDER BY rnum ) as lg
 FROM T  --> your original table  
)
SELECT id, flg, rnum,
       SUM(CASE WHEN flg=lg THEN 0 ELSE 1 END) OVER ( ORDER BY rnum ) AS ranks 
  FROM T2     

Демо

1 голос
/ 06 января 2020
create table #temp(id int,flag char(1),rnum int)
insert into #temp values (11,'n',1),(11,'n',2)
,(11,'y',3),(11,'n',4)
,(11,'n',5),(11,'y',6)
,(11,'n',7)

;With CTE as
(
select t.* 
,isnull(tt.rnum,t.rnum)NewRnum
from #temp t
outer apply(select top 1 rnum from #temp tt 
where t.id=tt.id and t.flag=tt.flag and t.rnum=tt.rnum+1 
order by rnum)tt
)
select * 
,dense_rank()over(order by newRNum)
from CTE

drop table #temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...