微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在选择查询中获取组的先前记录日期

我需要在不使用 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')

以下是预期的输出

enter image description here

解决方法

尝试加入一个减少的只有在 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

编辑:我造成了笛卡尔爆炸,所以我只是在那里撞了一个不同的人来解决

enter image description here

,

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

不幸的是,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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。