簡體   English   中英

間歇時間序列。 返回T-SQL中最新數據的最后一個連續塊的第一個日期

[英]Intermittent time series. Return first date of last contiguous block of most recent data in T-SQL

10/03/2011 11/03/2011 12/03/2011 13/03/2011 14/03/2011  15/03/2011  QUERYRESULT
a             a          a                      a            a       14/03/2011
                                    b           b            b       13/03/2011
c                        c          c           c                    12/03/2011

因此,對於最近的連續日期塊,返回該特定塊的最早日期,如“queryresult”列中所示。

我現在意識到我無意中轉換了我給出的示例中的數據。對於源可以假設模式是:[ID] 1,2,3,...; [type] a,b,c ..; [日期]

我可以通過遞歸CTE /窗口/排名函數看到一些東西,但無法弄明白。

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

假設數據是

ID  mydate  pfo
1   12/03/2011  a
4   13/03/2011  a
6   14/03/2011  a
10  16/03/2011  a
2   12/03/2011  b
5   13/03/2011  b
8   15/03/2011  b
3   12/03/2011  c
7   14/03/2011  c
9   15/03/2011  c
11  16/03/2011  c

然后

SELECT 

    MAX( n.mydate)
   ,n.pfo

 FROM testtable n

 LEFT OUTER JOIN
 testtable n2 ON  n.pfo                  = n2.pfo 
              AND DATEADD(D,-1,n.mydate) = n2.mydate

 WHERE n2.mydate IS NULL

 GROUP BY n.pfo
;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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM