【问题标题】:Find date Difference between rows based on first row根据第一行查找行之间的日期差异
【发布时间】:2015-11-10 05:45:22
【问题描述】:

我使用的是 SQL Server 2012。我有一个 QC 检查日期,其中包含 ID、事件和事件日期。以下是数据供参考。

 QUALITY_CHECK_NO   EVENT                   DATE
 101                QC EVENT 1              2015-01-07 00:00:00
 101                QC EVENT 2              2015-08-10 00:00:00
 101                QC EVENT 3              2015-08-13 00:00:00
 101                QC EVENT 4              2015-08-25 00:00:00
 101                QC EVENT 5              2015-08-11 00:00:00
 101                QC EVENT 6              2015-08-13 00:00:00
 101                QC EVENT 7              2015-08-18 00:00:00
 101                QC EVENT 8              2015-08-19 00:00:00
 101                QC EVENT 9              2015-08-24 00:00:00
 101                QC EVENT 10             2015-08-25 00:00:00
 101                QC EVENT 11             2015-08-25 00:00:00
 101                QC EVENT 12             2015-09-11 00:00:00
 101                QC EVENT 13             2015-09-25 00:00:00
 102                QC EVENT 1              2015-01-07 00:00:00
 102                QC EVENT 2              2015-08-10 00:00:00
 102                QC EVENT 3              2015-08-26 00:00:00
 102                QC EVENT 4              2015-08-27 00:00:00
 102                QC EVENT 5              2015-08-21 00:00:00
 102                QC EVENT 6              2015-08-20 00:00:00
 102                QC EVENT 7              2015-08-26 00:00:00
 102                QC EVENT 8              2015-08-26 00:00:00
 102                QC EVENT 9              2015-08-27 00:00:00
 102                QC EVENT 10             2015-08-27 00:00:00
 102                QC EVENT 11             2015-08-27 00:00:00
 102                QC EVENT 12             2015-09-11 00:00:00
 102                QC EVENT 13             2015-09-25 00:00:00
 103                QC EVENT 1              2015-01-07 00:00:00
 103                QC EVENT 2              2015-08-10 00:00:00
 103                QC EVENT 3              2015-08-12 00:00:00
 103                QC EVENT 4              2015-08-25 00:00:00
 103                QC EVENT 5              2015-08-21 00:00:00
 103                QC EVENT 6              2015-08-11 00:00:00
 103                QC EVENT 7              2015-08-20 00:00:00
 103                QC EVENT 8              2015-08-20 00:00:00
 103                QC EVENT 9              2015-08-24 00:00:00
 103                QC EVENT 10             2015-08-25 00:00:00
 103                QC EVENT 11             2015-08-25 00:00:00
 103                QC EVENT 12             2015-09-11 00:00:00
 103                QC EVENT 13             2015-09-25 00:00:00
 104                QC EVENT 1              2015-10-20 00:00:00
 104                QC EVENT 2              2015-10-21 00:00:00
 104                QC EVENT 3              2015-10-21 00:00:00
 104                QC EVENT 4              2015-10-23 00:00:00

我想查找每个 QualityCheckNo 的第一个事件日期和下一行之间的天数差异。我尝试使用 CTE,但是我得到了每行之间的天数差异,而不是我想要的。

基本上,我需要找出与 QC Event 1 和 EVENTS 相差多少天。像下面这样..

 QUALITY_CHECK_NO   EVENT       DATE                  DaysDiff
 101                QC EVENT 1  2015-01-07 00:00:00    0
 101                QC EVENT 2  2015-08-10 00:00:00    215
 101                QC EVENT 3  2015-08-13 00:00:00    218
 101                QC EVENT 4  2015-08-25 00:00:00    230
 101                QC EVENT 5  2015-08-11 00:00:00    216
 101                QC EVENT 6  2015-08-13 00:00:00    218

下面是我使用的sql代码。

WITH tableNumbered AS (
        SELECT QUALITY_CHECK_NO, EVENT, DATE, ROW_NUMBER() OVER (PARTITION BY SiteID ORDER BY SITEID, RNUM) as rNum FROM [db_lexitas_ods].[dbo].[vw_GetPvtDocumentTAT] )
        SELECT t.*,
           DATEDIFF(day,t2.[DATE],t.[DATE])
      as Daysdiff
    FROM tableNumbered t
    LEFT JOIN tableNumbered t2 ON t.[QUALITY_CHECK_NO] = t2.[QUALITY_CHECK_NO] AND t2.rNum + 1 = t.rNum

【问题讨论】:

  • 你的数据库/版本是什么
  • 由于 [括号] 假设 SQL Server。您的示例 SQL 与示例数据不匹配。我应该如何运行它?自己编架构?如果您需要帮助,请方便我们。
  • 您好,代码已更新,代码正在查找上一行和当前行的天数差异。我怎么想根据第一行和其他行找到天差。
  • @KarthikVenkatraman - 您可以使用sqlfiddle.com 并使用数据重新创建表格,然后共享相关链接吗?我们这样玩会容易得多

标签: sql sql-server-2012 common-table-expression


【解决方案1】:
select
    datediff(
        dd,
        min(EVENTDATE) over (partition by QUALITY_CHECK_NO),
        EVENTDATE
    )
from T

这假定事件 1 始终是最早的日期。 min 表达式也可以被替换为通过事件名称进行查找:

(
    select EVENTDATE from T t2
    where
            t2.QUALITY_CHECK_NO = t.QUALITY_CHECK_NO
        and EVENT = 'QC EVENT 1'
),

您的尝试几乎成功了,只是连接条件需要 rNum 等于 1 而不是 rNum + 1。而且由于您希望第一个差异为零,因此常规内部连接也可以工作。

还有另一个发布的答案使用group byjoin 来完成相同的事情,并且查询计划可能与上面第二个选项中的相关子查询相同。使用标量子查询可能有一个优势,因为如果写入错误并返回多行,它将引发错误。

【讨论】:

  • 这段代码如何让我知道 QualityCheckNo 的第一行和其他连续行之间的日期差异..
  • 计算中的开始日期很容易查找,因为它具有固定/已知的描述,并且显然也是该组中最早的日期。因此,利用这些事实对您有利。
【解决方案2】:

下面的代码应该可以解决你的需求。

Select QUALITY_CHECK_NO, EVENT, DATE, datediff(day, (select top(1) DATE from <table_name>), DATE) as DaysDiff from <table_name>;

【讨论】:

    【解决方案3】:
    SELECT 
        tableNumbered.Quality_Check_No
        ,tableNumbered.Event
        ,[tableNumbered.Date] [Date]
        ,DATEDIFF(d,Grp.MinDate,[tableNumbered.Date]) AS DateDiff
    FROM 
         tableNumbered 
    LEFT OUTER JOIN
        (SELECT Quality_Check_No, MIN(CONVERT(date,[Date]) AS MinDate)
         FROM tableNumbered 
         GROUP BY Quality_Check_No
        ) Grp ON tableNumbered.Quality_Check_No = Grp.Quality_Check_No
    

    【讨论】:

      【解决方案4】:

      如果您的唯一目的是查找前一行之间的天数差异,那么您可以使用 LAG()。

      SELECT QUALITY_CHECK_NO,EVENT,date,
      DATEDIFF(day,LAG(DATE) OVER (ORDER BY EVENT),DATE)
      FROM Table
      

      LEAD()和LAG()的详细解释可以看here

      同样的工作SQLFiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-31
        • 2018-04-08
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多