Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

T-sql Đặt lại Số hàng khi Thay đổi Trường

Nếu bạn đang sử dụng SQL Server 2012, bạn có thể sử dụng LAG để so sánh giá trị với hàng trước đó và bạn có thể sử dụng SUM HẾT để ghi lại các thay đổi.

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

Cập nhật:

Phiên bản dành cho SQL Server 2005. Nó sử dụng CTE đệ quy và bảng tạm thời để lưu trữ trung gian dữ liệu bạn cần lặp lại.

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. Truy vấn SQL nào nhanh hơn? Lọc theo tiêu chí Tham gia hoặc mệnh đề Where?

  2. Làm cách nào để định dạng datetime dưới dạng M / D / YYYY trong SQL Server?

  3. sp_executesql chậm với các tham số

  4. Ràng buộc đa tính năng đã vi phạm SQL Server 2008 - CodeFirst

  5. Bỏ qua câu lệnh WHERE nếu biến cho câu lệnh đó là null