sql >> Database >  >> RDS >> Sqlserver

T-sql Rijnummer resetten bij veldwijziging

Als u SQL Server 2012 gebruikt, kunt u LAG gebruiken om de waarde te vergelijken met de vorige rij en u kunt SUM gebruiken en OVER om de wijzigingen vast te leggen.

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

Bijwerken:

Een versie voor SQL Server 2005. Het gebruikt een recursieve CTE en een tijdelijke tabel voor tussentijdse opslag van de gegevens die u moet herhalen.

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. Mysql-optimalisatie op basis van explain

  2. Hoe kan ik MySQL-database converteren naar SQLite in PHP?

  3. Hoe gebruik ik MySQL in Visual Studio 2010 met EF4?

  4. Filter op uitvoerclausule sql