【问题标题】:How to get previous record date for a group in a select query如何在选择查询中获取组的先前记录日期
【发布时间】:2021-02-05 07:32:10
【问题描述】:

我需要在不使用 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,2,'1/13/2020'),
(4,2,'1/13/2020'),
(5,3,'1/24/2020')

下面是预期的输出:

【问题讨论】:

  • 将问题本身中的任何数据和查询发布为文本。图像无法复制和执行。我们也猜不出你想要什么样的分组。发布示例数据、所需的输出以及您尝试过的内容。
  • 您发布的是图片,而不是数据。图片不能复制和查询。不要强迫人们为了测试而输入所有内容,浪费时间输入而不是尝试不同的查询。
  • 您如何尝试计算 PrevDate 字段?您想要第 # n-1 组的最后一个日期吗?这至少是我能从那张图片中推断出的最好的结果。
  • 对不起。这是示例表。创建表 #Sampledata ( id int ,groupno int ,Date date ) 插入 #Sampledata 值 (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')
  • 在我看来更像是 nextdate。 1 月 13 日到 1 月 2 日是怎么算的?

标签: sql sql-server msbi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • “我造成了笛卡尔爆炸,所以我只是在里面撞了一个不同的东西来解决它”?
    • 此解决方案假定 groupno 是连续的。
    猜你喜欢
    • 2018-02-19
    • 2017-10-11
    • 2011-09-06
    • 1970-01-01
    • 2010-12-04
    • 2021-04-03
    • 2017-10-02
    • 2021-12-03
    相关资源
    最近更新 更多