【问题标题】:Selecting from a single date column and creating multiple start and end records从单个日期列中选择并创建多个开始和结束记录
【发布时间】:2014-10-15 13:16:02
【问题描述】:

我真的很想解决这个问题,但有一点你必须把它放在那里,学习并继续前进。

我有一个临时表,其中包含 1 列 POCDates,它是日期列表,其中一些是连续/连续的。例如:

POCDates
01/01/2014
02/01/2014
03/01/2014
04/01/2014
10/03/2014
11/03/2014
25/03/2014
26/03/2014
28/03/2014

我希望在我的过程中运行一个查询,该查询将从这个临时表中进行选择,并使用上面的示例数据显示以下内容:

POCDatesSummary
Start        End         Count
01/01/2014   04/01/2014  4
10/03/2014   11/03/2014  2
25/03/2014   26/03/2014  2
28/03/2014   28/03/2014  1

计数不是必需的,但我怀疑这是使用 DATEDIFF 最简单的部分,所以我把它留在了那里。

我已经尝试了多种方法并在论坛上搜索了类似的问题;什么都没有接近。希望我能在这里找到答案。

【问题讨论】:

  • 也许这会帮助你朝着正确的方向前进:stackoverflow.com/questions/13566303/…
  • 您使用的是什么版本的 SQL Server?这可以使答案更简单。您想将日期分组为连续范围吗?
  • SQL Server 2008(我已经更新了标签)。简单地说,是的,当一组天是连续的时,我要求以某种方式或形式将它们分组为一个范围,理想情况下在帖子中作为示例结果呈现,以便进行进一步的分析。

标签: sql sql-server sql-server-2008 ssms


【解决方案1】:

使用递归 CTE:

;WITH cte1 AS (
    SELECT  POCDates, ROW_NUMBER() OVER (ORDER BY POCDates) AS RowNumber
    FROM    MyTable
), cte2 AS (
    SELECT  POCDates,
            POCDates AS RangeStart,
            POCDates AS RangeEnd,
            RowNumber
    FROM    cte1
    WHERE   RowNumber = 1
    UNION ALL
    SELECT      c1.POCDates,
                CASE
                    WHEN c1.POCDates = DATEADD(day,1,c2.POCDates) THEN c2.RangeStart
                    ELSE c1.POCDates
                END             AS RangeStart,
                c1.POCDates     AS RangeEnd,
                c1.RowNumber
    FROM        cte2 c2
    INNER JOIN  cte1 c1 ON c1.RowNumber = c2.RowNumber + 1
) 

SELECT  RangeStart          AS [Start],
        MAX(RangeEnd)       AS [End],
        COUNT(RangeStart)   AS [Count]
FROM    cte2
GROUP BY RangeStart
OPTION  (MAXRECURSION 0)

MAXRECURSION 0 允许 CTE 无限重复。默认值为 10,如果您的表超过 10 行,这将导致查询失败。

【讨论】:

  • 这里的抽象思维令人印象深刻,感谢您抽出宝贵的时间来写这篇文章。再进行一些测试,看看它是否经得起严格的考验,但到目前为止一切似乎都很好。极限竞速!
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 2022-01-25
  • 2020-05-07
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多