SQL Server 2008(无 LAG 功能)- 值更改时的组 Min/Max 日期
SQL Server 2008 (No LAG function) - Group Min/Max date when Value changes
我有一个现有的@table
ID Date Val
1 2014-10-01 1
2 2014-10-02 1
3 2014-10-03 2
4 2014-10-04 2
5 2014-10-05 2
6 2014-10-06 1
7 2014-10-07 1
8 2014-10-08 1
9 2014-10-09 1
日期顺序很重要。我需要查看每个 Val 序列的第一个和最后一个日期:
如何获取每个序列的 SQL 到 return min/max 日期?我需要证明:
即
1 2014-10-01 2014-10-02
2 2014-10-03 2014-10-05
1 2014-10-06 2014-10-09
我在其他开发人员的帮助下使用 2012 的 LAG 功能完成了此工作,但我需要使用 2008
尝试失败:
select t.Val,MIN(t.date),MAX(tnext.date)
from @T t join
@T tnext
on t.id = tnext.id - 1 and
t.Val <> tnext.val
group by
t.val
设置:
declare @T table(ID int,[Date] date,Val int)
Insert Into @T(ID,[Date],Val)
values
(1,'2014/10/01', 1),
(2,'2014/10/02', 1),
(3,'2014/10/03', 2),
(4,'2014/10/04', 2),
(5,'2014/10/05', 2),
(6,'2014/10/06', 1),
(7,'2014/10/07', 1),
(8,'2014/10/08', 1),
(9,'2014/10/09', 1)
我相信这个查询应该有效:
select
val,
start_date = min(date),
end_date = max(date)
from
(
select
val,
date,
grp = row_number() over (partition by val order by date)
- row_number() over (order by date)
from
@t
) x
group by
grp, val
order by
min(date)
上面的查询假定日期是严格按顺序排列的。
我有一个现有的@table
ID Date Val
1 2014-10-01 1
2 2014-10-02 1
3 2014-10-03 2
4 2014-10-04 2
5 2014-10-05 2
6 2014-10-06 1
7 2014-10-07 1
8 2014-10-08 1
9 2014-10-09 1
日期顺序很重要。我需要查看每个 Val 序列的第一个和最后一个日期:
如何获取每个序列的 SQL 到 return min/max 日期?我需要证明: 即
1 2014-10-01 2014-10-02
2 2014-10-03 2014-10-05
1 2014-10-06 2014-10-09
我在其他开发人员的帮助下使用 2012 的 LAG 功能完成了此工作,但我需要使用 2008
尝试失败:
select t.Val,MIN(t.date),MAX(tnext.date)
from @T t join
@T tnext
on t.id = tnext.id - 1 and
t.Val <> tnext.val
group by
t.val
设置:
declare @T table(ID int,[Date] date,Val int)
Insert Into @T(ID,[Date],Val)
values
(1,'2014/10/01', 1),
(2,'2014/10/02', 1),
(3,'2014/10/03', 2),
(4,'2014/10/04', 2),
(5,'2014/10/05', 2),
(6,'2014/10/06', 1),
(7,'2014/10/07', 1),
(8,'2014/10/08', 1),
(9,'2014/10/09', 1)
我相信这个查询应该有效:
select
val,
start_date = min(date),
end_date = max(date)
from
(
select
val,
date,
grp = row_number() over (partition by val order by date)
- row_number() over (order by date)
from
@t
) x
group by
grp, val
order by
min(date)
上面的查询假定日期是严格按顺序排列的。