使用子查询选择存储过程中日期之间的差异

Selecting the difference between dates in a stored procedure using a subquery

我不知道这是否可能,但我觉得我以前可能做过,但丢失了那部分代码。我正在尝试制作一个 select 语句,其中包含子查询的内部联接,以显示来自相同 table.

的两个日期之间的天数

一个简单的数据结构示例如下:

Name  ID  Date    Day       Hours
Bill  1   3/3/20  Thursday   8
Fred  2   4/3/20  Monday     6
Bill  1   8/3/20  Tuesday    2

基于此数据,我想 select 每行加上一个额外的列,即每个 ID 的每一行的日期之间的天数。类似于:

Select * from tblData
Inner join (datediff(Select Top(1) Date from tblData where Date < Date), Date) And ID = ID) 

或为简单起见:

Select * from tblData
Inner join (datediff(Select Top(1) Date from tblData where Date < 8/3/20), 8/3/20) And ID = 1)

生成的数据集如下所示:

Name  ID  Date    Day       Hours  DaysBtwn
Bill  1   3/3/20  Thursday   8     4 (Assuming there was an earlier row in the table)
Fred  2   4/3/20  Monday     6     5 (Assuming there was an earlier row in the table)
Bill  1   8/3/20  Tuesday    2     5 (Based on the previous row date being 3/3/20 for Bill)

这是否有意义,我是否尝试以错误的方式执行此操作?我想在 table 中对大约 600000 行执行此操作,因此效率是关键,所以如果有更好的方法来执行此操作,我愿意接受建议。

您可以使用 lag():

select t.*, datediff(day, lag(date) over(partition by id order by date), date) diff
from mytable t

我想你只是想要 lag():

select t.*,
       datediff(day,
                lag(date) over (partition by name order by date),
                date
               ) as diff
from tblData t;

注意:如果要过滤数据以便结果集中的行用于 lag() 而不是结果集中的行,则使用子查询:

select t.*
from (select t.*,
             datediff(day,
                      lag(date) over (partition by name order by date),
                      date
                     ) as diff
      from tblData t
     ) t
where date < '2020-08-03';

另请注意将日期常量用作 YYYY-MM-DD 格式的字符串。