[英]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.