如何根据上次结果将日期增加一年(DateTime Banding)

Posted

技术标签:

【中文标题】如何根据上次结果将日期增加一年(DateTime Banding)【英文标题】:How To Increment Date By One Year, Based on Last Result (DateTime Banding) 【发布时间】:2019-01-28 11:10:38 【问题描述】:

希望我能比标题更好地解释这一点。

我有一个如下所示的活动表:

|身份证| |许可证号| |日期时间| |1 | |123 | |2017-11-17 11:19:04.420| |2 | |123 | |2017-11-26 10:16:52.790| |3 | |123 | |2018-02-06 11:13:21.480| |4 | |123 | |2018-02-19 10:12:32.493| |5 | |123 | |2018-05-16 09:33:05.440| |6 | |123 | |2019-01-02 10:05:25.193|

我需要的是每个许可证号的行数,基本上以 12 个月的间隔分组。但是,年份需要从上一个条目结束时开始。

例如,我需要从 2017-11-17 11:19:04.420 开始的 12 个月的所有记录的计数,然后我需要从 (2017-11-17 11:19:04.420 开始的所有记录的计数+ 12 个月)再延长 12 个月,依此类推。

我考虑过使用递归 CTE、LAG 函数等,但无法完全弄清楚。我可能可以使用 CASE 语句和静态值做一些事情,但这需要每年更新报告代码。

任何为我指明正确方向的帮助将不胜感激!

【问题讨论】:

您能否发布您提供的数据的预期输出以及到目前为止的尝试? 【参考方案1】:

我认为以下使用 CTE 的代码可以帮助您,但我不完全确定您想要实现什么:

WITH CTE AS 
( 
SELECT TOP 1 DateTime
FROM YourTable
ORDER BY ID
UNION ALL
SELECT DATEADD(YEAR, 1, DateTime)
FROM CTE 
WHERE DateTime<= DATEADD(YEAR, 1, GETDATE())
)
SELECT  LicenseNumber, DateTime, Count(*) AS Rows
FROM CTE
INNER JOIN YourTable
ON YourTable.DateTime BETWEEN CTE.DateTime AND DATEADD(YEAR, 1, CTE.DateTime)
GROUP BY LicenseNumber, DateTime;

【讨论】:

【参考方案2】:

嗯。您只需要第一次记录后每隔 12 个月的记录数吗?

如果是这样:

select dateadd(year, yr - 1, min_datetime),
       dateadd(year, yr, min_datetime),
       count(t.id)
from (values (1), (2), (3)) v(yr) left join
     (select t.*,
             min(datetime) over () as min_datetime
      from t
     ) t     
     on t.datetime >= dateadd(year, yr - 1, min_datetime) and
        t.datetime < dateadd(year, yr, min_datetime)
group by dateadd(year, yr - 1, min_datetime),
         dateadd(year, yr, min_datetime)
order by yr;

如果你想要的话,这可以很容易地延长到更多年。

【讨论】:

以上是关于如何根据上次结果将日期增加一年(DateTime Banding)的主要内容,如果未能解决你的问题,请参考以下文章

显示自最近的数据库 DateTime 以来经过的时间,并每隔一秒增加一次

Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年

我如何编写一个 python/pandas 循环来将 sql 查询中的日期增加一天

如何项sql数据库中添加一年的日期

如何插入 365 行并为每一行增加一天的日期

根据上次日期选择记录