sql >> Database teknologi >  >> RDS >> Sqlserver

T-sql Nulstil rækkenummer ved feltændring

Hvis du er på SQL Server 2012, kan du bruge LAG for at sammenligne værdi med forrige række, og du kan bruge SUM og OVER for at registrere ændringerne.

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

Opdatering:

En version til SQL Server 2005. Den bruger en rekursiv CTE og en midlertidig tabel til mellemlagring af de data, du skal gentage.

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. Kan jeg bruge returværdien af ​​INSERT...RETURNING i en anden INSERT?

  2. Gør mens loop i SQL Server 2008

  3. yii2 hvordan man bruger søgning med sqldataProvider

  4. Sådan beregner du vækst i procent uge over uge i MySQL