提问者:小点点

SQL将所有事件绑定到3个月的桶中


我正在尝试创建一个3个月向前看类型表。因此,例如,任何last_day(event_date)='2021-01-01'(即Jan-2021)的事件在2021年2月和2021年3月也是有效的。

对于每一个事件,我想在发生后的2个月内再排一次。以下示例:

给定如下所示的数据:

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

有点纠结于如何实现这一点。您可以假设event_date在这里是有效的datetime字段。我试过几种不同的方法都没有用。对于类似的情况,我通常使用窗口函数,这里有preforefollows限制,但leadlag类型函数只允许设置1个偏移量,而不允许设置偏移量范围。

感谢任何帮助。在psql工作。


共1个答案

匿名用户

您可以通过两个步骤完成此操作:

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

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

select distinct event_date, customer_id from table;

这是基础,每行生成的另外两个信息依赖于此数据。也许您可以为此创建一个视图并重用它。我将这样做,并将其称为view,但您也可以直接使用SQL语句。将其视为view等于select distinct event_date,customer_idfrom 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,例如选择event_date+30,customer_id,从view选择event_date+60,customer_id,从view

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