【问题标题】:Add variable to count consecutive months添加变量以计算连续月份
【发布时间】:2021-12-26 21:16:41
【问题描述】:

我在 Postgres 数据库中有一个查询,它结合了客户订阅。

我想添加一个名为“连续几个月”的变量,但我不确定如何在 Postgres 中执行。

我的原始表是这样的:

client product Date
1 Sub 2020-10-01
1 Sub 2020-11-01
2 Sub 2020-11-01
2 Sub 2020-12-01
1 Sub 2021-01-01
1 Sub 2021-02-01
2 Sub 2021-02-01

我想要有一些东西可以计算连续几个月的起源,如下所示:

client product Date Consecutive_months
1 Sub 2020-10-01 1
1 Sub 2020-11-01 2
2 Sub 2020-11-01 1
2 Sub 2020-12-01 2
1 Sub 2021-01-01 1
1 Sub 2021-02-01 2
2 Sub 2021-02-01 1

感谢您的帮助!

【问题讨论】:

  • 这个问题看起来一点也不相似?
  • 那个问题是关于时间间隔的,我正在尝试做类似的事情,但添加了一个不断增加的变量。我不知道如何存储变量,甚至不知道何时启动它。在 2 月 21 日查看时,您如何参考 prod(previous report)?

标签: sql postgresql gaps-and-islands


【解决方案1】:

基于标签 OP 显然意识到这是一个差距和孤岛问题。此查询提取月份和年份信息以生成按月递增的序列。之后,只需要使用标准差分逻辑来查找不同步的行并创建标记。

with A as (
    select *,
        date_part('year', dt) * 12 + date_part('month', dt)
          - row_number() over (partition by client, product order by dt) as grp
    from T
)
select *,
    row_number()
        over (partition by client, product, grp order by dt) as consecutive_months
from A;

如果对于给定的客户产品在同一个月内出现多行是可以接受的,那么在这两个地方都将row_number() 切换为dense_rank()

https://dbfiddle.uk/?rdbms=postgres_9.5&fiddle=397a2f3282cab3b70bd7a47d1dc5ea0a

【讨论】:

    【解决方案2】:

    看起来您遇到了“峡岛”类型的问题。

    诀窍是根据每个客户的连接日期计算一些排名。

    然后可以根据客户和排名计算出一个序号。

    select client, product, "Date"
    , row_number() over (partition by client, daterank order by "Date") as Consecutive_months
    from
    (
      select "Date", client, product
      , dense_rank() over (partition by client order by "Date") 
        + (DATE_PART('year', AGE(current_date, "Date"))*12 + 
           DATE_PART('month', AGE(current_date, "Date"))) daterank
    from raw t
    ) q
    order by "Date", client
    
    客户 |产品 |日期 |连续_月 -----: | :-------- | :--------- | -----------------: 1 |子 | 2020-10-01 | 1 1 |子 | 2020-11-01 | 2 2 |子 | 2020-11-01 | 1 2 |子 | 2020-12-01 | 2 1 |子 | 2021-01-01 | 1 1 |子 | 2021-02-01 | 2 2 |子 | 2021-02-01 | 1

    db小提琴here

    【讨论】:

    • 谢谢你们!我设法做到了,现在我熟悉了这些功能(我的 DW 在 BQ,必须做一些修改)。两个问题:为什么要乘以 12?是否有可能使其多年来一直计数?从 2020 年到 2021 年,计数回到 0
    • 一年有 12 个月,因此 '3 年 6 个月' 的范围总共给出了 3*12+6=42 个月。不知道那些年的事。可能不是?但我建议在测试代码中加入更多的测试数据来验证。
    • 我正在尝试解决它,如果我找到解决方案,我会在这里发布。谢谢!
    • 我找到了!要“忘记”年份的变化并保持计数,它只是一个``` DATE_DIFF(current_date, "Date", Month) ``` 至少在 BQ 上。谢谢@LukStorms
    • @Alezzpt 酷。搞清楚这件事做得很好。 (竖起大拇指)
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多