Количество Количество последовательных вхождений значений в таблице с новым счетчиком разделов, хотя повторяются строки - PullRequest
0 голосов
/ 12 мая 2019
create table #t_Jenas (Id int, Name char)

insert into #t_Jenas values
(1, 'A'),
(2, 'A'),
(3, 'B'),
(4, 'B'),
(5, 'B'),
(6, 'B'),
(7, 'C'),
(8, 'B'),
(9, 'B')

для разбиения номера строки на, если повторяющиеся строки будут продолжать номер, то есть столбец минус не будет возрастать.Любая идея, как сделать номер раздела начинается с 1, хотя повторять строки, как данные выше?

select name,row_number() over (order by id) as cont ,row_number() over (partition by name order by id) as newcount,( row_number() over (order by id)-row_number() over (partition by name order by id)) as rowminusnewcount  --, count(*) as cnt
from #t_Jenas

Факт:

name    cont    newcount    rowminusnewcount
A   1   1   0
A   2   2   0
B   3   1   2
B   4   2   2
B   5   3   2
B   6   4   2
C   7   1   6
B   8   5   3
B   9   6   3

Ожидаемый:

name    cont    newcount    rowminusnewcount
A   1   1   0
A   2   2   0
B   3   1   2
B   4   2   2
B   5   3   2
B   6   4   2
C   7   1   6
B   8   1   7
B   9   2   7

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Я думаю, cont, newcount и rowminusnewcount - все номера строк. Я изменил id, чтобы показать идею.

create table #t_Jenas (Id int, Name char);

insert into #t_Jenas values
(10, 'A'),
(20, 'A'),
(30, 'B'),
(40, 'B'),
(50, 'B'),
(60, 'B'),
(70, 'C'),
(80, 'B'),
(90, 'B');

select name,  cont,
       row_number() over (partition by grp, name order by id) as new_count,
       cont - row_number() over (partition by grp, name order by id) rowminusnewcount 
from (
 select t.*, row_number() over (order by id) as cont
      , row_number() over (order by id) - row_number() over (partition by name order by id) as grp
       from #t_Jenas t
     ) t
order by id

Результат

name    cont    new_count   rowminusnewcount
A   1   1   0
A   2   2   0
B   3   1   2
B   4   2   2
B   5   3   2
B   6   4   2
C   7   1   6
B   8   1   7
B   9   2   7
0 голосов
/ 12 мая 2019

Я понял значение последнего столбца:

select name, id,
       row_number() over (partition by grp, name order by id) as new_count,
       count(*) over (order by min_grp_id) - count(*) over (partition by grp, name)
from (select t.*, min(id) over (partition by grp, name) as min_grp_id
      from (select t.*,
                   (row_number() over (order by id) - row_number() over (partition by name order by id)
                   ) as grp
            from t_Jenas t
           ) t
     ) t
order by id;

Здесь - это дБ <> скрипка.

...