sql >> Databasteknik >  >> RDS >> Sqlserver

T-sql Återställ radnummer vid fältändring

Om du använder SQL Server 2012 kan du använda LAG för att jämföra värde med föregående rad och du kan använda SUM och ÖVER för att registrera ändringarna.

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

Uppdatering:

En version för SQL Server 2005. Den använder en rekursiv CTE och en temporär tabell för mellanlagring av data som du behöver iterera över.

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-fiol



  1. Vänster-yttre gå med i Postgres Returnerar inte värden för Null

  2. Hur väljer man bara ett underordnat tabellobjekt för varje överordnad post?

  3. WEEKOFYEAR() Exempel – MySQL

  4. Räknar förändringar i tidslinjen med MySQL