我有一个日期列表,需要找到31天内的第一个日期:
ID Date
101 6/8/16
101 10/27/16
101 11/25/16
101 12/14/16
101 1/1/17
101 1/7/17
101 2/1/17
由于第一个日期发生在2016年6月8日,那将是'锚点'日期。 6/8/16将被视为31天期间的第一个日期(2016年6月8日 - 2016年7月8日),然后找到第一个日期发生在7/9/16和8/8 /之间16如果他们有一个,在8/9/16 - 9/8/16之间,依此类推。此外,所有这些日期必须在每年的1月1日至12月1日之间,因此不包括12/14/16。提前谢谢。
这个的输出是:
ID Date
101 6/8/16
101 10/27/16
101 11/25/16
101 1/1/17
101 2/1/17
答案 0 :(得分:1)
对于每一行,计算与最小日期的差异,并将其除以31以创建这31天的时间段。然后获取每个时期的最短日期。要从12月中排除这些日期,您可以计算MMDD并添加WHERE条件:
WITH cte AS
(
SELECT id, date,
datediff(day, Min(date) Over (partition by id), date) / 31 AS period
FROM vt
WHERE datepart(m, date) * 100 + datepart(d, date)
BETWEEN 0101 AND 1201
)
SELECT id, Min(date)
FROM cte
GROUP BY id, period