Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

T-sql Setel Ulang Nomor Baris pada Perubahan Bidang

Jika Anda menggunakan SQL Server 2012, Anda dapat menggunakan LAG untuk membandingkan nilai dengan baris sebelumnya dan Anda dapat menggunakan SUM dan LEBIH untuk merekam perubahan.

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

Pembaruan:

Versi untuk SQL Server 2005. Ini menggunakan CTE rekursif dan tabel temp untuk penyimpanan perantara data yang perlu Anda ulangi.

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. Apa cara terbaik untuk menangani DBNull's

  2. Apa yang dimaksud dengan opsi Salin Saja Cadangan ini?

  3. Menjelajahi Operasi Indeks Online Tingkat Partisi di SQL Server 2014 CTP1

  4. Bagaimana cara membandingkan jika dua string berisi kata-kata yang sama di T-SQL untuk SQL Server 2008?

  5. Bagaimana menjalankan prosedur tersimpan setiap hari di SQL Server Express Edition?