2014-11-09 17 views
12

Tôi có bảng này:Đếm bao nhiêu lần một thay đổi giá trị boolean trong SQL Server

 [SDate - DateTime]     [Value] - Represents a boolean 
    2010-11-16 10:10:00     1 
    2010-11-16 10:11:00     0 
    2010-11-16 10:12:00     1 
    2010-11-16 10:13:00     1 

Tôi cần một truy vấn để đếm bao nhiêu lần thay đổi giá trị.

Ví dụ:

2010-11-16 10:10:00     0 
    2010-11-16 10:11:00     1 
    2010-11-16 10:12:00     0 
    2010-11-16 10:13:00     0 
    2010-11-16 10:14:00     1 
    2010-11-16 10:15:00     0 
    2010-11-16 10:16:00     1 
    ... 
             5 changes 

2010-11-16 10:10:00     0 
    2010-11-16 10:11:00     0 
    2010-11-16 10:12:00     0 
    2010-11-16 10:13:00     1 
    2010-11-16 10:14:00     1 
    2010-11-16 10:15:00     1 
    2010-11-16 10:16:00     1 
    ...          
             1 change 

Trả lời

8

Bạn có thể làm điều này với lag():

select count(*) 
from (select t.*, lag(value) order by (sdate) as prev_value 
     from table t 
    ) t 
where prev_value <> value ; 
+1

Cảm ơn bạn rất nhiều !, Tôi nghĩ rằng đó là OVER (theo thứ tự bởi (sdate)) –

1

Pre-SQL Server 2012 giải pháp:

declare @t table (sdate datetime, value int) 

insert into @t(sdate, value) 
values 
--('2010-11-16 10:10:00', 0), 
--('2010-11-16 10:11:00', 1), 
--('2010-11-16 10:12:00', 0), 
--('2010-11-16 10:13:00', 0), 
--('2010-11-16 10:14:00', 1), 
--('2010-11-16 10:15:00', 0), 
--('2010-11-16 10:16:00', 1) 
('2010-11-16 10:10:00', 0), 
('2010-11-16 10:11:00', 0), 
('2010-11-16 10:12:00', 0), 
('2010-11-16 10:13:00', 1), 
('2010-11-16 10:14:00', 1), 
('2010-11-16 10:15:00', 1), 
('2010-11-16 10:16:00', 1) 


;with t_with_seq as (
    select 
    t.*, 
    ROW_NUMBER() OVER(ORDER BY t.sdate asc) as seq 
    from @t t 
) 
select 
    COUNT(*) 
from t_with_seq r 
    inner join t_with_seq r_next on r_next.seq = r.seq + 1 
where r.value <> r_next.value 
2

Điều này cũng sẽ hoạt động trong các phiên bản cũ hơn ..

;WITH cte 
    AS (SELECT Row_number()OVER(ORDER BY sdates) rn,* 
     FROM <tablename>) 
SELECT Sum(CASE WHEN a.boolvalue = b.boolvalue THEN 0 ELSE 1 END) 
FROM cte a 
     JOIN cte b 
     ON a.rn = b.rn + 1 
Các vấn đề liên quan