【问题标题】:Query to reorganize dates查询以重新组织日期
【发布时间】:2020-10-20 03:59:12
【问题描述】:

我需要对 Postgres 数据库表进行转换,但我不知道从哪里开始。 这是表格:

| Customer   Code | Activity | Start Date |
|:---------------:|:--------:|:----------:|
|       100       |     A    | 01/05/2017 |
|       100       |     A    | 19/07/2017 |
|       100       |     B    | 18/09/2017 |
|       100       |     C    | 07/12/2017 |
|       101       |     A    | 11/02/2018 |
|       101       |     B    | 02/04/2018 |
|       101       |     B    | 14/06/2018 |
|       100       |     A    | 13/07/2018 |
|       100       |     B    | 14/08/2018 |

客户可以始终按照该顺序执行活动 A、B 和 C。 要执行活动 B,他/她必须执行活动 A。要执行 C,他/她必须执行活动 A,然后执行 B。 同一个客户可以多次执行一项活动或一个周期。

我需要以这种方式重新组织表格,放置每个步骤的开头和结尾:

| Customer   Code | Activity | Start Date |  End Date  |
|:---------------:|:--------:|:----------:|:----------:|
|       100       |     A    | 01/05/2017 | 18/09/2017 |
|       100       |     B    | 18/09/2017 | 07/12/2017 |
|       100       |     C    | 07/12/2017 | 13/07/2018 |
|       101       |     A    | 11/02/2018 | 02/04/2018 |
|       101       |     B    | 02/04/2018 |            |
|       100       |     A    | 13/07/2018 | 14/08/2018 |
|       100       |     B    | 14/08/2018 |            |

【问题讨论】:

  • Start date的数据类型是什么?

标签: sql postgresql select window-functions gaps-and-islands


【解决方案1】:

这里是解决这个差距和孤岛问题的方法:

select
    customer_code,
    activity,
    start_date,
    case when (activity, lead(activity) over(partition by customer_code order by start_date))
        in (('A', 'B'), ('B', 'C'), ('C', 'A'))
        then lead(start_date) over(partition by customer_code order by start_date)
    end end_date
    from (
        select 
            t.*, 
            lead(activity) over(partition by customer_code order by start_date) lead_activity
        from mytable t
    ) t
where activity is distinct from lead_activity

查询首先删除具有相同customer_codeactivity 的连续行。然后,当activty在序列中时,我们使用条件逻辑将下一行的start_date带入。

Demo on DB Fiddle

客户代码 |活动 |开始日期 |结束日期 ------------: | :------- | :--------- | :--------- 100 |一个 | 2017-07-19 | 2017-09-18 100 |乙| 2017-09-18 | 2017-12-07 100 | C | 2017-12-07 | 2018-07-13 100 |一个 | 2018-07-13 | 2018-08-14 100 |乙| 2018-08-14 | 101 |一个 | 2018-02-11 | 2018-06-14 101 |乙| 2018-06-14 |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 2014-10-23
    • 2011-11-14
    • 2015-04-17
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多