问题描述
我需要在不使用 CTE 或临时表的情况下计算 Prevdate
,如下所示。我尝试使用铅,它只适用于上面的一行。此外,每个组的记录数可能会有所不同。有人可以在这里提出解决方案吗?
以下是示例数据:
create table #Sampledata
(
id int,groupno int,Date date
)
insert into #Sampledata values (
1,1,'1/2/2020'),(2,2,'1/13/2020'),(3,(4,(5,3,'1/24/2020')
以下是预期的输出:
解决方法
尝试加入一个减少的只有在 groupno 继续时才有效。
select distinct s1.*,s2.PrevDate
from #Sampledata as s1
left join (
select groupno - 1 as num,[Date] as PrevDate
from #Sampledata
) as s2 on s1.groupno = s2.num
编辑:我造成了笛卡尔爆炸,所以我只是在那里撞了一个不同的人来解决
,您所说的上一个日期实际上是下一个日期。这有助于理解问题。
不幸的是,SQL Server 不完全支持 range
窗口框架,因此窗口函数(至少在简单的方式上)不合适。
一种方法是在聚合子查询中使用 lead()
并将结果加入:
select sd.*,g.next_date
from sampledata sd join
(select groupno,lead(min(date)) over (order by groupno) as next_date
from Sampledata
group by groupno
) g
on sd.groupno = g.groupno;
另一个选项是cross apply
:
select sd.*,x.next_date
from sampledata sd outer apply
(select top (1) min(sd2.date) as next_date
from sampledata sd2
where sd2.date > sd.date
) x;
当然,如果确实是按顺序枚举组,则可以将 sd2.date > sd.date
替换为 sd2.groupno = sd.groupno + 1
。
Here 是一个 dbfiddle。