如何在 select 查询中获取组的先前记录日期

How to get previous record date for a group in a select query

我需要在不使用 CTE 或临时表的情况下计算 Prevdate,如下所示。我尝试使用 lead 它仅适用于上面的一行。每组的记录数也可能不同。有人可以在这里提出解决方案吗?

示例数据如下:

create table #Sampledata 
(
id int
,groupno int
,Date date
)
insert into #Sampledata values (
1,1,'1/2/2020'),
(2,2,'1/13/2020'),
(3,2,'1/13/2020'),
(4,2,'1/13/2020'),
(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

编辑:我引起了笛卡尔爆炸,所以我只是在那里撞了一个 distinct 来解决问题

你所说的上一个日期实际上是下一个日期。这有助于理解问题。

不幸的是,SQL 服务器不完全支持 range window 帧,因此 window 功能(至少在简单的方式上)不合适。

一种方法是在聚合子查询中使用 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 是一个 db<>fiddle.