【发布时间】:2021-03-10 17:22:56
【问题描述】:
我正在尝试编写一些 SQL 查询,但到目前为止还没有运气。 我想在示例中接收每个事件的 event_start 和 event_end(不幸的是,没有 event_id!)
输入
| event_timestamp | event_date | customer_ID | event_name |
|---|---|---|---|
| 2021-02-07 16:18:18.000000 | 2021-02-07 | 1234567 | event_start |
| 2021-02-07 16:34:44.000000 | 2021-02-07 | 1234567 | event_end |
| 2021-02-07 16:49:08.000000 | 2021-02-07 | 1234567 | event_start |
| 2021-02-07 17:04:35.000000 | 2021-02-07 | 1234567 | event_end |
| 2021-02-07 17:19:46.000000 | 2021-02-07 | 1234567 | event_start |
| 2020-09-28 09:37:09.000000 | 2020-09-28 | 7654321 | event_start |
| 2020-09-28 09:52:08.000000 | 2020-09-28 | 7654321 | event_start |
| 2020-09-28 13:15:17.000000 | 2020-09-28 | 7654321 | event_end |
逻辑如下:
- 如果 event_end 正好在 event_start 之后,则接收 event_start 的时间戳作为开始,接收后续 event_end 的时间戳作为结束
- 如果在 event_end 之前有多个 event_start,则接收第一个 event_start 的时间戳作为开始,并接收结束此 event_start 循环的 event_end 的时间戳
- 如果 event_start 后面没有 event_end(对于指定的日期和 ID),则 event_end = 23:59:59 将在同一天晚上到期
我认为我应该使用某种窗口函数,但我似乎无法弄清楚究竟是什么以及如何!
任何帮助将不胜感激!
基本上新表应该是这样的:
| customer_ID | event_date | start | end |
|---|---|---|---|
| 1234567 | 2021-02-07 | 2021-02-07 16:18:18.000000 | 2021-02-07 16:34:44.000000 |
| 1234567 | 2021-02-07 | 2021-02-07 16:49:08.000000 | 2021-02-07 17:04:35.000000 |
| 1234567 | 2021-02-07 | 2021-02-07 17:19:46.000000 | 2021-02-07 23:59:59.000000 |
| 7654321 | 2020-09-28 | 2020-09-28 09:37:09.000000 | 2020-09-28 13:15:17.000000 |
【问题讨论】:
-
您能否将您的输入和结果作为文本而不是链接图像放入问题中?用图像做任何事情都非常困难。
-
我删除了不一致的数据库标签。请标记您真正使用的数据库。
-
对不起,第一次……我希望现在更好
标签: sql postgresql