【问题标题】:DateDiff with multiple events Same Column SQL Server具有多个事件的 DateDiff 相同的列 SQL Server
【发布时间】:2016-09-20 06:36:42
【问题描述】:

提前感谢您提供的任何帮助。我正在寻找存储在同一列中的事件之间的日期差异。参考样本数据,我正在寻找“部分提交”和它们各自随后的“Jr Reviewed”事件之间的差异。

再次引用相同的数据,我需要来自

的 dateDiff
  • 第一次“部分审查”到第一次“Jr 审查”
  • 第 2 次“部分审查”到第 2 次“Jr 审查”
  • 第 6 次“部分审查”到第 3 次“Jr 审查”

我不确定从哪里开始,我所做的只是添加按“描述”分区并按“日期”升序排序的行号。任何类型的指导或完成方法(递归 CTE?)这将不胜感激。

Start End - 2 records

【问题讨论】:

  • 如何订购餐桌? IDX?哪个 DBMS?
  • 那么您的预期结果是什么样的?
  • 嘿 Neer,是的,这些是由 IDX 订购的,我一直在使用 IDX 而不是 date,因为我们有一些时区问题。
  • Neer - Microsoft Sql Server
  • Damien,我最终需要每个记录号的事件之间的平均时间。如果有多个,我将使用第一个。 IE 2nd Partial to 2nd Jr Reviewed 事件。

标签: tsql datediff recursive-query


【解决方案1】:
DECLARE @Tbl TABLE (RowNumber INT, RecordNumber INT, IDX INT, DESCRIP NVARCHAR(50), DATES DATETIME, EVENTNUM INT)
INSERT INTO @Tbl
VALUES  
(1, 11515,  13, 'Partial Submission', '8/12/16 00:21',  3078),
(1, 11515,  14, 'Junior Reviewed', '8/12/16 15:52',  3089),
(2, 11515,  26, 'Partial Submission', '8/18/16 15:24',  3078),
(3, 11515,  33, 'Partial Submission', '9/6/16 9:47',  3078),
(4, 11515,  34, 'Partial Submission', '9/6/16 9:47',  3078),
(5, 11515,  39, 'Partial Submission', '9/9/16 13:19',  3078),
(2, 11515,  40, 'Junior Reviewed', '9/11/16 8:30',  3089),
(6, 11515,  46, 'Partial Submission', '9/15/16 12:30',  3078),
(3, 11515,  54, 'Junior Reviewed', '9/17/16 10:01',  3089),
(7, 11515,  57, 'Full! Submission', '9/19/16 9:16',  3079),
(1, 11520,  19, 'Partial Submission', '8/20/16 00:42',  3078),
(1, 11520,  22, 'Junior Reviewed', '8/22/16 9:06',  3089),
(2, 11520,  28, 'Partial Submission', '8/29/16 20:12',  3078),
(2, 11520,  34, 'Junior Reviewed', '9/1/16 8:20',  3089),
(3, 11520,  38, 'Partial Submission', '9/8/16 15:03',  3078),
(4, 11520,  39, 'Partial Submission', '9/8/16 15:03',  3078),
(3, 11520,  47, 'Junior Reviewed', '9/14/16 13:53',  3089),
(5, 11520,  48, 'Full! Submission', '9/16/16 13:19',  3079),
(4, 11520,  52, 'Junior Reviewed', '9/17/16 10:51',  3089),
(6, 11520,  53, 'Full! Submission', '9/19/16 16:21',  3079)


;WITH CTE
AS
(
  SELECT 
      *, 
      RowId         = ROW_NUMBER() OVER (Partition BY Recordnumber ORDER BY Recordnumber, IDX),
      RowIdByDescrip    = ROW_NUMBER() OVER (PARTITION BY Recordnumber, DESCRIP ORDER BY Recordnumber, IDX)
  FROM @tbl
)


,Test as 
(
    SELECT
        A.Recordnumber,
        A.DESCRIP,
        A.EVENTNUM,
        A.IDX, 
        A.DATES StartDate, 
        LEAD(A.DATES) OVER ( Partition BY A.Recordnumber ORDER BY A.IDX) EndDate,
        DATEDIFF(HOUR, A.DATES, LEAD(A.DATES) OVER (Partition BY A.Recordnumber ORDER BY A.IDX)) AS DateDifff
    FROM @tbl A INNER JOIN 
        (
            SELECT
                C.Recordnumber,
                MIN(C.IDX) AS IDX
            FROM 
       CTE C

            GROUP BY 
                C.RowId - C.RowIdByDescrip,
                C.DESCRIP,
                C.Recordnumber
       ) B ON A.IDX = B.IDX and A.Recordnumber = B.Recordnumber
    ) 

Select 
*
From Test
Where eventnum in ('3078')
order by Recordnumber, IDX

【讨论】:

  • 是的!谢谢你。最好的部分是我至少学到了 2 个新东西。我从未使用过 LEAD,也从未在 GROUP BY 中减去过。非常感谢您坚持这篇文章和所有的帮助。
【解决方案2】:

尝试如下:

DECLARE @Tbl TABLE (RowNumber INT, RecordNumber INT, IDX INT, DESCRIP NVARCHAR(50), DATES DATETIME, EVENTNUM INT)
INSERT INTO @Tbl
VALUES  
(1, 11515,  13, 'Partial Submission', '8/12/16 00:21',  3078),
(1, 11515,  14, 'Junior Reviewed', '8/12/16 15:52',  3089),
(2, 11515,  26, 'Partial Submission', '8/18/16 15:24',  3078),
(3, 11515,  33, 'Partial Submission', '9/6/16 9:47',  3078),
(4, 11515,  34, 'Partial Submission', '9/6/16 9:47',  3078),
(5, 11515,  39, 'Partial Submission', '9/9/16 13:19',  3078),
(2, 11515,  40, 'Junior Reviewed', '9/11/16 8:30',  3089),
(6, 11515,  46, 'Partial Submission', '9/15/16 12:30',  3078),
(3, 11515,  54, 'Junior Reviewed', '9/17/16 10:01',  3089),
(7, 11515,  57, 'Full! Submission', '9/19/16 9:16',  3079),
(1, 11520,  19, 'Partial Submission', '8/20/16 00:42',  3078),
(1, 11520,  22, 'Junior Reviewed', '8/22/16 9:06',  3089),
(2, 11520,  28, 'Partial Submission', '8/29/16 20:12',  3078),
(2, 11520,  34, 'Junior Reviewed', '9/1/16 8:20',  3089),
(3, 11520,  38, 'Partial Submission', '9/8/16 15:03',  3078),
(4, 11520,  39, 'Partial Submission', '9/8/16 15:03',  3078),
(3, 11520,  47, 'Junior Reviewed', '9/14/16 13:53',  3089),
(5, 11520,  48, 'Full! Submission', '9/16/16 13:19',  3079),
(4, 11520,  52, 'Junior Reviewed', '9/17/16 10:51',  3089),
(6, 11520,  53, 'Full! Submission', '9/19/16 16:21',  3079)


;WITH CTE
AS
(
    SELECT 
        *, 
        ROW_NUMBER() OVER (ORDER BY IDX) RowId,
        ROW_NUMBER() OVER (PARTITION BY DESCRIP ORDER BY IDX) RowIdByDescrip
    FROM @Tbl
    WHERE
        EVENTNUM IN 
        (
            3078, --Partial Submission
            3089 -- Junior Reviewed
        )
), CTE2
AS
(
     SELECT
        MIN(C.IDX) AS IDX
    FROM 
        CTE C
    GROUP BY 
        C.RowId - C.RowIdByDescrip,
        C.DESCRIP
)

SELECT      
    R.RecordNumber,   
    R.IDX ,
    R.StartDate ,
    R.EndDate ,
    R.DateDifff
FROM
(
    SELECT
        A.EVENTNUM,
        A.RecordNumber,
        A.DESCRIP,
        A.IDX, 
        A.DATES StartDate, 
        LEAD(A.DATES) OVER (ORDER BY A.IDX) EndDate,
        DATEDIFF(HOUR, A.DATES, LEAD(A.DATES) OVER (ORDER BY A.IDX)) AS DateDifff
    FROM
        @Tbl A INNER JOIN 
        CTE2 B ON A.IDX = B.IDX
 ) R
 WHERE
    R.EVENTNUM = 3078 --Partial Submission
ORDER BY R.RecordNumber

结果:

RecordNumber IDX         StartDate          EndDate            DateDifff
------------ ----------- ----------------   ----------------   -----------
11515        13          2016-08-12 00:21   2016-08-12 15:52   15
11515        26          2016-08-18 15:24   2016-09-06 09:47   450
11515        34          2016-09-06 09:47   2016-09-01 08:20   -121
11515        46          2016-09-15 12:30   2016-09-14 13:53   -23
11520        38          2016-09-08 15:03   2016-09-11 08:30   65
11520        19          2016-08-20 00:42   2016-08-22 09:06   57

【讨论】:

  • 会的,我只是尝试了前一个,它非常接近,但返回的结果太多,我可以在尝试您的最新更新后用我的意思编辑我的问题。
  • 哇,太棒了。它看起来很完美。非常感谢你。我添加了记录号,因为会有多条记录,但这不应该是一个问题。据我所知,您在连接中使用了具有多个子查询的 CTE?
  • 我使用 CTE 来提高可读性。您可以不使用 CTE,也可以使用多个 cte。
  • 太棒了,将其标记为已回答。我打算把它分解并弄清楚你到底做了什么,但如果我碰巧遇到与此相关的任何事情,可以联系你吗?如果没有,没问题,感谢您的所有帮助和快速响应。
  • 已更新 - 我仍然认为这已得到解答,但我需要添加更多记录编号,即其他交易,并且数据变得倾斜。我尝试按记录编号添加分区,但到目前为止还没有工作。
【解决方案3】:

这不是答案。评论太长了。

我猜。我没有完全理解这个问题。让我告诉你我知道的。

首先,按照IDX排序

我只是在Partial SubmissionJunior Reviewed这两个事件之间工作

结果表:Partial Submission Start - Junior Reviewed END

RowNumber   RecordNumber IDX         DESCRIP                                            DATES                       EVENTNUM    RowId                RowIdByDescrip
----------- ------------ ----------- -------------------------------------------------- -----------------------     ----------- -------------------- --------------------
1           11515        13          Partial Submission Start                           2016-08-12 00:21:00.000     3078        1                    1
1           11515        14          Junior Reviewed    END                             2016-08-12 15:52:00.000     3089        2                    1
1           11520        19          Partial Submission Start                           2016-08-20 00:42:00.000     3078        3                    2
1           11520        22          Junior Reviewed    END                             2016-08-22 09:06:00.000     3089        4                    2
2           11515        26          Partial Submission Start                           2016-08-18 15:24:00.000     3078        5                    3
2           11520        28          Partial Submission                                 2016-08-29 20:12:00.000     3078        6                    4
3           11515        33          Partial Submission                                 2016-09-06 09:47:00.000     3078        7                    5
4           11515        34          Partial Submission                                 2016-09-06 09:47:00.000     3078        8                    6
2           11520        34          Junior Reviewed    End                             2016-09-01 08:20:00.000     3089        9                    3
3           11520        38          Partial Submission Start                           2016-09-08 15:03:00.000     3078        10                   7
4           11520        39          Partial Submission                                 2016-09-08 15:03:00.000     3078        11                   8
5           11515        39          Partial Submission                                 2016-09-09 13:19:00.000     3078        12                   9
2           11515        40          Junior Reviewed     End                            2016-09-11 08:30:00.000     3089        13                   4
6           11515        46          Partial Submission  Start                          2016-09-15 12:30:00.000     3078        14                   10
3           11520        47          Junior Reviewed     End                            2016-09-14 13:53:00.000     3089        15                   5
4           11520        52          Junior Reviewed                                    2016-09-17 10:51:00.000     3089        16                   6
3           11515        54          Junior Reviewed                                    2016-09-17 10:01:00.000     3089        17                   7

结果:

RecordNumber IDX         StartDate          EndDate            DateDifff
------------ ----------- ----------------   ----------------   -----------
11515        13          2016-08-12 00:21   2016-08-12 15:52   15
11515        26          2016-08-18 15:24   2016-09-06 09:47   450
11515        34          2016-09-06 09:47   2016-09-01 08:20   -121
11515        46          2016-09-15 12:30   2016-09-14 13:53   -23
11520        38          2016-09-08 15:03   2016-09-11 08:30   65
11520        19          2016-08-20 00:42   2016-08-22 09:06   57

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2018-08-22
    • 2020-04-08
    • 2021-07-08
    相关资源
    最近更新 更多