具有多个事件的DateDiff相同列SQL Server

时间:2016-09-20 06:36:42

标签: tsql datediff recursive-query

提前感谢您提供的任何帮助。我希望获得存储在同一列中的事件之间的日期差异。参考样本数据,我正在寻找"部分提交"和他们随后的" Jr评论"事件。

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

的dateDiff
  • 1st" Partial Review"到第1" Jr评论"
  • 2nd" Partial Review"到第二" Jr评论"
  • 6th" Partial Review"到第3" Jr评论"

我不知道从哪里开始,我所做的只是添加由" Descrip"分隔的rownumbers。由"日期"命令ASC。任何形式的指导或方法(递归CTE?)这将非常感激。

Start End - 2 records

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试如下:

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

答案 2 :(得分:0)

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

我猜。我完全不明白这个问题。让我告诉你我所知道的。

首先,根据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