首页 > 解决方案 > SQL 将所有事件放入 3 个月的存储桶中

问题描述

我正在尝试创建一个 3 个月的前瞻类型表。例如,任何事件LAST_DAY(event_date) = '2021-01-01'(即 2021 年 1 月)在 2021 年 2 月和 2021 年 3 月也有效。

对于每个事件,我想要在它发生之后的 2 个月内再排一排。下面的例子:

给定如下所示的数据:

活动日期 客户ID
1月21日 一个
2月21日
1月21日 一个
6月21日 C
3月21日 D

我想创建一些看起来像这样的东西:

活动日期 客户ID
1月21日 一个
2月21日 一个
3月21日 一个
2月21日
3月21日
Apr-21
6月21日 C
7月21日 C
8月21日 C
3月21日 D
Apr-21 D
5月21日 D

有点坚持如何实现这一目标。您可以假设event_date这里是一个有效的日期时间字段。我尝试了一些不同的方法,但无济于事。我通常会在此处使用PRECEDINGFOLLOWING限制类似的窗口函数,但是LEADLAG类型函数仅允许您设置 1 个偏移量而不是偏移量范围。

任何帮助表示赞赏。在 PSQL 中工作。

标签: sqlpostgresqlpsql

解决方案


您可以分两步执行此操作:

  1. 对数据进行分组(例如 A 出现两次,但您只想计算一次,因为在这种情况下 A 的两行相同)
  2. 为下个月和下个月生成带有附加行的新数据

鉴于您的示例,第一步很简单,在更复杂的情况下,您可以使用 对数据进行分组group by,这里 adistinct就足够了:

select distinct event_date, customer_id from table;

这是基础,每行生成的其他两个信息都依赖于该数据。也许您可以为此创建一个视图并重用它。我会这样做并调用它view,但您也可以直接使用 SQL 语句。认为它view等于select distinct event_date, customer_id from table

第二步可以通过添加下个月的数据来完成,之后一个月的数据也是如此。一个工会浮现在脑海中。

select event_date, customer_id from view
UNION 
select next_month(event_date), customer_id from view
UNION
select after_next_month(event_date), customer_id from view

现在我们剩下日期算术,你想计算下一个月和之后的一个月。

如果这对你来说没问题,我建议你只在日期上加上 30,例如select event_date + 30, customer_id from viewand select event_date + 60, customer_id from view

否则,进行适当的日期算术应该不会太难,请参阅日期/时间函数和运算符


推荐阅读