How to write a statement that groups data by date but shows when data changed for the first time
date – when data changed
a,b,c – some data and it can be anything
x
date,a,b,c
04/26/2008,1,1,1
04/25/2008,1,2,1
04/24/2008,1,1,1
04/23/2008,1,1,1
04/22/2008,1,1,1
04/21/2008,2,2,2
04/20/2008,1,1,1
This is should be the result. It might have the same data on different dates, but it missing the next day when data stayed the same.
04/26/2008,1,1,1
04/25/2008,1,2,1
04/22/2008,1,1,1
04/21/2008,2,2,2
04/20/2008,1,1,1
It should work on MS SQL Server 2008 r2
Advertisement
Answer
This is like a gaps and islands problem.
create table yourtablename ([date] date,a int,b int,c int);
insert into yourtablename values
('04/26/2008',1,1,1)
,('04/25/2008',1,2,1)
,('04/24/2008',1,1,1)
,('04/23/2008',1,1,1)
,('04/22/2008',1,1,1)
,('04/21/2008',2,2,2)
,('04/20/2008',1,1,1);
; with cte as
(
select date, a,b,c,combinedstring=cast(a as varchar(max))+ cast(b as varchar(max))+ cast(c as varchar(max))
from yourtablename
)
,cte2 as
(select *,
rn1=row_number() over (partition by combinedstring order by date asc)
,rn2= row_number() over (order by date asc)
from cte
)
select y.*
from
(
select date=min(date)
from cte2
group by (rn2-rn1),combinedstring) t
join yourtablename y
on t.date=y.date