如何在 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.
我需要在不使用 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.