【问题标题】:How to get StartDate and EndDate by comparing multiple rows and columns如何通过比较多行和多列来获取 StartDate 和 EndDate
【发布时间】:2019-06-01 19:53:55
【问题描述】:

我的表中有以下数据:

ID     StartDate    EndDate 
-------------------------------
222    2019-04-01   2019-04-16
222    2019-04-16   2019-04-30
562    2019-04-01   2019-04-08
562    2019-04-08   2019-04-15
562    2019-04-15   2019-04-22
562    2019-04-22   2019-04-29
228    2019-04-02   2019-04-09
228    2019-04-10   2019-04-16
228    2019-04-15   2019-04-23
228    2019-04-26   2019-04-30
228    2019-04-01   2019-04-16

条件是如果Enddate = StartDate,那么它必须检查他们的StartDateEndDate和预期的输出如下:

ID      StartDate       EndDate 
-----------------------------------
222     2019-04-01      2019-04-30
562     2019-04-01      2019-04-29

【问题讨论】:

  • 如果数据看起来像这样呢?ID StartDate EndDate 222 2019-04-01 2019-04-15 222 2019-04-16 2019-04-30
  • 您不只是分别为StartDateEndDate 列返回MINMAX..?解决这个问题你累了什么?
  • 在检查任何 ID 的完整时长时,我只需要确保我没有错过任何一周或一天。
  • 不确定我是否理解您的问题,但此查询应返回预期输出:SELECT ID, MIN(StartDate) AS StartDate, MAX(EndDate) AS EndDate FROM dbo.YourTable GROUP BY ID;
  • 如果有任何一天的差距,那么 Min 和 Max 无济于事。

标签: sql-server


【解决方案1】:

我会这样做,使用LEAD。您可以使用LEAD 检查下一个StartDate 是否与当前EndDate 具有相同的值。如果是,我返回 0,如果不是 1,并且这些值的 SUM 为 0,我们知道所有日期都是连续的:

WITH CTE AS(
    SELECT ID,
           StartDate,
           EndDate,
           CASE LEAD(StartDate,1, EndDate) OVER (PARTITION BY ID ORDER BY StartDate) WHEN EndDate THEN 0 ELSE 1 END AS IsContinous
    FROM (VALUES(222,CONVERT(date,'2019-04-01'),CONVERT(date,'2019-04-16')),
                (222,CONVERT(date,'2019-04-16'),CONVERT(date,'2019-04-30')),
                (562,CONVERT(date,'2019-04-01'),CONVERT(date,'2019-04-08')),
                (562,CONVERT(date,'2019-04-08'),CONVERT(date,'2019-04-15')),
                (562,CONVERT(date,'2019-04-15'),CONVERT(date,'2019-04-22')),
                (562,CONVERT(date,'2019-04-22'),CONVERT(date,'2019-04-29')),
                (228,CONVERT(date,'2019-04-02'),CONVERT(date,'2019-04-09')),
                (228,CONVERT(date,'2019-04-10'),CONVERT(date,'2019-04-16')),
                (228,CONVERT(date,'2019-04-15'),CONVERT(date,'2019-04-23')),
                (228,CONVERT(date,'2019-04-26'),CONVERT(date,'2019-04-30')),
                (228,CONVERT(date,'2019-04-01'),CONVERT(date,'2019-04-16'))) V (ID, StartDate, EndDate))
SELECT ID,
       MIN(StartDate) AS StartDate,
       MAX(EndDate) AS EndDate
FROM CTE
GROUP BY ID
HAVING SUM(IsContinous) = 0;

【讨论】:

  • 您好@Lamu,下面我们该如何处理?

    ExternalID Extract_StartDate Extract_EndDate IsContinous
    2180 2019-05-05 2019-05-12 1
    2180 2019-05-10 2019-05-17 1
    218130 2019-05-12 2019-05-19 1
    218130 2019-05-12 2019-05-19 1
    2180 2019 -05-17 2019-05-24 1
    2180 2019-05-17 2019-05-24 1
    2180 2019-05-19 2019-05-26 1
    2180 2019-05 -24 2019-05-31 0
  • 你好@Lamu,下面我们该如何处理? ExternalID Extract_StartDate Extract_EndDate IsContinous 2180 2019-05-05 2019-05-12 1 2180 2019-05-10 2019-05-17 1 218130 2019-05-12 2019-05-19 1 218130 2019-05-12 2019-5-12 19 1 2180 2019-05-17 2019-05-24 1 2180 2019-05-17 2019-05-24 1 2180 2019-05-19 2019-05-26 1 2180 2019-05-24 2019-05-31 0
  • 如果您有新问题@user9952388,请提出新问题。该数据在 cmets 中是不可读的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多