【问题标题】:Postgresql split single row into multiple rows based on datePostgresql根据日期将单行拆分为多行
【发布时间】:2021-08-21 10:14:39
【问题描述】:

在我的例子中,我们有一个表 ABC,其中假定有 1 行。

id name start_date end_date
1 Rahul 01/01/2021 06/01/2021

但在检索时,我想获得多行,其中开始日期递增 1,直到它小于或等于结束日期。

id name start_date end_date
1 Rahul 01/01/2021 06/01/2021
1 Rahul 02/01/2021 06/01/2021
1 Rahul 03/01/2021 06/01/2021
1 Rahul 04/01/2021 06/01/2021
1 Rahul 05/01/2021 06/01/2021
1 Rahul 06/01/2021 06/01/2021

请告诉我我们该怎么做。

【问题讨论】:

标签: sql database postgresql recursive-query


【解决方案1】:

使用generate_series()。假设数据是按天计算的:

select t.id, t.name, gs.date, t.end_date
from t cross join lateral
     generate_series(start_date, end_date, interval '1 day') gs(date);

如果您的数据实际上是按月计算的,您只需将 '1 day' 更改为 '1 month'

注意:Postgres 允许在 select 中设置返回函数,因此您可以将其写为:

select t.id, t.name,
       generate_series(start_date, end_date, interval '1 day') as date,
       t.end_date
from t;

但是,我认为这不是一个好习惯。我对 select 表达式更改查询返回的行数感到不舒服。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多