sql >> Databáze >  >> RDS >> Sqlserver

T-sql Resetovat číslo řádku při změně pole

Pokud používáte SQL Server 2012, můžete použít LAG k porovnání hodnoty s předchozím řádkem a můžete použít SUM a PŘED zaznamenat změny.

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

Aktualizace:

Verze pro SQL Server 2005. Používá rekurzivní CTE a dočasnou tabulku pro dočasné ukládání dat, která potřebujete k iteraci.

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 Výběr ze dvou různých tabulek.

  2. Jak vyřešit ORA-04063:zobrazení SYS.ALL_QUEUE_TABLES obsahuje chyby?

  3. Jak zavolat ukázkový helloword func pomocí kódu java

  4. Způsobeno:org.hibernate.MappingException:Opakovaný sloupec v mapování pro entitu