sql - 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
这里是一个有效的日期时间字段。我尝试了一些不同的方法,但无济于事。我通常会在此处使用PRECEDING
和FOLLOWING
限制类似的窗口函数,但是LEAD
,LAG
类型函数仅允许您设置 1 个偏移量而不是偏移量范围。
任何帮助表示赞赏。在 PSQL 中工作。
解决方案
您可以分两步执行此操作:
- 对数据进行分组(例如 A 出现两次,但您只想计算一次,因为在这种情况下 A 的两行相同)
- 为下个月和下个月生成带有附加行的新数据
鉴于您的示例,第一步很简单,在更复杂的情况下,您可以使用 对数据进行分组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 view
and select event_date + 60, customer_id from view
。
否则,进行适当的日期算术应该不会太难,请参阅日期/时间函数和运算符。
推荐阅读
- angular - 打字稿检索 ArrayBuffer 的数组
- gradle - 如何强制 IDEA 使用特定的 Gradle 版本?
- python - 添加@tf.function后如何更改代码
- swift - 我在我的项目中使用 Mapbox,想在道路的任一边缘创建折线。如何获取道路边缘的坐标
- excel - 试图从仪表板获取单元信息
- python-3.x - 使用 Tabula 和 csv 文件的 Pandas 中的列标题错误
- html - CSS:将部分的边缘与页眉和页脚正确对齐
- java - 如何验证 iframe 标签下的文本
- javascript - 使用单选按钮复制文本区域的内容
- python - 如何在迭代 Pandas 数据框的嵌套循环中优化性能