为每个 id 生成日期系列

问题描述

我有一个四列的表格。我想为从 iddate1 的每个 date3 创建一个具有 1 天间隔的日期列。如果没有date3,那么直到date2,如果没有date2,那么只有date1

如何在 Postgres 中实现这一点?谢谢!

示例数据:

+-------+---------------------+---------------------+---------------------+
|  id   |        date1        |        date2        |        date3        |
+-------+---------------------+---------------------+---------------------+
| 76efg | 2021-01-03 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 |
| b67cs | 2021-01-09 03:45:24 | 2021-01-14 06:55:13 |                     |
| fsf56 | 2021-01-25 11:18:03 | 2021-01-25 11:18:03 |                     |
| ghl56 | 2021-01-29 14:25:57 | 2021-02-02 17:37:10 | 2021-02-18 01:13:37 |
| 90tum | 2021-02-18 06:13:30 |                     |                     |
+-------+---------------------+---------------------+---------------------+

id '76efg' 的期望输出

+-------+--------------+---------------------+---------------------+---------------------+--+
|  id   | date_created |        date1        |        date2        |        date3        |  |
+-------+--------------+---------------------+---------------------+---------------------+--+
| 76efg | 2021-01-03   | 2021-01-03 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 |  |
| 76efg | 2021-01-04   | 2021-01-03 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 |  |
| 76efg | 2021-01-05   | 2021-01-03 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 |  |
| 76efg | 2021-01-06   | 2021-01-03 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 |  |
| 76efg | 2021-01-07   | 2021-01-03 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 |  |
| 76efg | 2021-01-08   | 2021-01-03 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 |  |
+-------+--------------+---------------------+---------------------+---------------------+--+

解决方法

您是否尝试过使用 generated_series()?以下查询基于 date1date2date3 以及使用 COALESCE 找到的系列的限制生成一系列时间戳 - 基本上检查列是否为 {{ 1}} .

null

检查这个db<>fiddle

感谢@clamp 关于 WITH j (id,date1,date2,date3) AS ( VALUES ('76efg','2021-01-03 06:33:54'::TIMESTAMP,'2021-01-07 05:19:03'::TIMESTAMP,'2021-01-08 05:19:03'::TIMESTAMP ),('b67cs','2021-01-09 03:45:24'::TIMESTAMP,'2021-01-14 06:55:13'::TIMESTAMP,NULL),('90tum','2021-02-18 06:13:30'::TIMESTAMP,NULL,NULL) ) SELECT id,generate_series( date1,COALESCE(date3,date1),'1 day'::INTERVAL) AS date_created,date3 FROM j; id | date_created | date2 | date3 -------+---------------------+---------------------+--------------------- 76efg | 2021-01-03 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 76efg | 2021-01-04 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 76efg | 2021-01-05 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 76efg | 2021-01-06 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 76efg | 2021-01-07 06:33:54 | 2021-01-07 05:19:03 | 2021-01-08 05:19:03 b67cs | 2021-01-09 03:45:24 | 2021-01-14 06:55:13 | b67cs | 2021-01-10 03:45:24 | 2021-01-14 06:55:13 | b67cs | 2021-01-11 03:45:24 | 2021-01-14 06:55:13 | b67cs | 2021-01-12 03:45:24 | 2021-01-14 06:55:13 | b67cs | 2021-01-13 03:45:24 | 2021-01-14 06:55:13 | b67cs | 2021-01-14 03:45:24 | 2021-01-14 06:55:13 | 90tum | 2021-02-18 06:13:30 | | 的提示:

COALESCE(COALESCE(date3,date2),date1) 等价于 COALESCE(date3,date1)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...