Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

T-sql Нулиране на номера на ред при промяна на полето

Ако използвате SQL Server 2012, можете да използвате LAG за да сравните стойността с предишния ред и можете да използвате SUM и НАД за да запишете промените.

with C1 as
(
  select custno,
         moddate,
         who,
         lag(who) over(order by moddate) as lag_who
  from chr
),
C2 as
(
  select custno,
         moddate,
         who,
         sum(case when who = lag_who then 0 else 1 end) 
            over(order by moddate rows unbounded preceding) as change 
  from C1
)
select row_number() over(partition by change order by moddate) as RowID,
       custno,
       moddate,
       who
from C2

SQL Fiddle

Актуализация:

Версия за SQL Server 2005. Използва рекурсивен CTE и временна таблица за междинно съхранение на данните, които трябва да обходите.

create table #tmp
(
  id int primary key,
  custno int not null,
  moddate datetime not null,
  who varchar(10) not null
);

insert into #tmp(id, custno, moddate, who)
select row_number() over(order by moddate),
       custno,
       moddate,
       who
from chr;

with C as
(
  select 1 as rowid,
         T.id,
         T.custno,
         T.moddate,
         T.who,
         cast(null as varchar(10)) as lag_who
  from #tmp as T
  where T.id = 1
  union all
  select case when T.who = C.who then C.rowid + 1 else 1 end,
         T.id,
         T.custno,
         T.moddate,
         T.who,
         C.who
  from #tmp as T
    inner join C
      on T.id = C.id + 1
)
select rowid,
       custno,
       moddate,
       who
from C
option (maxrecursion 0);

drop table #tmp;

SQL Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разделен със запетаи списък в SQL

  2. Какво е съхранена процедура?

  3. Вече е добавен елемент със същия ключ. Грешка в SSRS при опит за задаване на набор от данни

  4. SqlParameter вече се съдържа от друга колекция SqlParameterCollection - мами ли using() {}?

  5. SQL NVARCHAR и VARCHAR граници