【问题标题】:Intermittent time series. Return first date of last contiguous block of most recent data in T-SQL间歇时间序列。返回 T-SQL 中最新数据的最后一个连续块的第一个日期
【发布时间】:2011-07-17 06:14:41
【问题描述】:
10/03/2011 11/03/2011 12/03/2011 13/03/2011 14/03/2011 15/03/2011 查询结果 啊啊啊啊 14/03/2011 b b b 2011 年 3 月 13 日 c c c c 2011 年 12 月 3 日

因此,对于最近的连续日期块,返回该特定块的最早日期,如“查询结果”列中所示。

我现在意识到我无意中转置了我给出的示例中的数据 对于源可以假设架构是:[ID] 1,2,3,...; [类型] a,b,c..; [日期]

我可以通过递归 CTE/窗口/排名函数看到一些东西,但不能完全弄清楚。

【问题讨论】:

    标签: sql tsql date time-series


    【解决方案1】:

    比我想象的要容易,并且不需要 CTE 或窗口/排名功能:

    假设数据是

    ID mydate pfo 1 2011 年 12 月 3 日 4 2011 年 3 月 13 日 6 2011 年 3 月 14 日 10 2011 年 3 月 16 日 2 2011 年 12 月 3 日 b 5 2011 年 3 月 13 日 b 8 2011 年 3 月 15 日 b 3 2011 年 12 月 3 日 c 7 2011 年 3 月 14 日 c 9 2011 年 3 月 15 日 c 11 2011 年 3 月 16 日 c

    然后

    选择 MAX(n.mydate) ,n.pfo FROM 测试表 n 左外连接 测试表 n2 ON n.pfo = n2.pfo AND DATEADD(D,-1,n.mydate) = n2.mydate 其中 n2.mydate 为空 按 n.pfo 分组

    【讨论】:

    • 根据估计的计划,与我的解决方案相比,亮度是我的两倍。伟大的! +1
    【解决方案2】:
    ;WITH data (type, date) AS (
      SELECT 'a', CAST('20110310' AS datetime) UNION ALL
      SELECT 'a', CAST('20110311' AS datetime) UNION ALL
      SELECT 'a', CAST('20110312' AS datetime) UNION ALL
      SELECT 'a', CAST('20110314' AS datetime) UNION ALL
      SELECT 'a', CAST('20110315' AS datetime) UNION ALL
      SELECT 'b', CAST('20110313' AS datetime) UNION ALL
      SELECT 'b', CAST('20110314' AS datetime) UNION ALL
      SELECT 'b', CAST('20110315' AS datetime) UNION ALL
      SELECT 'c', CAST('20110310' AS datetime) UNION ALL
      SELECT 'c', CAST('20110312' AS datetime) UNION ALL
      SELECT 'c', CAST('20110313' AS datetime) UNION ALL
      SELECT 'c', CAST('20110314' AS datetime)
    ),
    grouped AS (
      SELECT
        type,
        date,
        groupID = DATEADD(day, -ROW_NUMBER() OVER (PARTITION BY type ORDER BY date), date)
      FROM data
    ),
    startdates AS (
      SELECT
        type,
        groupStartDate = MIN(date)
      FROM grouped
      GROUP BY type, groupID
    )
    SELECT
      type,
      LastGroupStartDate = MAX(groupStartDate)
    FROM startdates
    GROUP BY type
    

    【讨论】:

    • 这会向 Adolf 的查询返回不同的结果。
    • @Martin:在删除额外元素时丢失了-ROW_NUMBER() 中的-。现在修好了。感谢您的关注。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2015-01-31
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    相关资源
    最近更新 更多