【问题标题】:How to track week over week growth while accounting for missing weeks如何在考虑缺失周数的同时跟踪周周增长
【发布时间】:2019-01-10 16:37:47
【问题描述】:

假设我们有一个match 表,并且该表的精简版本如下所示:

Column                             |           Type           | Collation | Nullable |      Default
-----------------------------------+--------------------------+-----------+----------+--------------------
uuid                               | uuid                     |           | not null | uuid_generate_v4()
present_state                      | text                     |           |          |
created_at                         | timestamp with time zone |           | not null |
updated_at                         | timestamp with time zone |           |          |

我正在尝试获取从过去某个任意日期开始的活动匹配数的一周一周表示。

根据架构,我们可以通过查看created_at 列、对它们进行分组和计数来了解一周内开始了多少新的活动匹配。对于已经结束的比赛,我们可以通过查看updated_at 列并确保present_state 已“完成”来执行类似的操作。

另外需要考虑的是,可能有几周根本没有比赛发生,比赛可以无限期地进行。我一直在试图强迫一些 CTE 提供一个表格,其中包含一个比赛开始的每个日期的条目,一个相反的表格,每个比赛结束的日期,以及一个我可以加入的生成时间序列考虑到缺少的几周。这是我到目前为止所得到的:

    ; WITH matches_begun AS 
        (
            SELECT 
                date_trunc('day', created_at)::date AS date 
            FROM matches
        )
    , matches_finished AS 
        (
            SELECT 
                 date_trunc('day', updated_at)::date AS date 
            FROM matches 
            WHERE present_state = 'finished'
        )
    , weekly_time_series AS 
        (
            select  generate_series( '2018-01-01', current_date, interval '1 day' )
        )

我不知道如何返回显示从过去的某个时间点到本周每周有多少活跃匹配的数据。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    这可能就是您要找的。​​p>

    with weekly_time_series(report_date) AS (
      select  generate_series( '2018-01-01', current_date, interval '1 day' )
    ), weekly_counts(report_week, weekly_count) as (
      select date_trunc('week', report_date) 
           , count(distinct uuid) 
        from weekly_time_series
        left join matches
          on date_trunc('day', created_at) <= report_date
         and (present_state <> 'finished' or 
          report_date < date_trunc('day', updated_at))
       group by date_trunc('week', report_date)
    )
    select report_week
         , weekly_count
         , weekly_count - coalesce(lag(weekly_count) over (order by report_week), 0) delta
      from weekly_counts;
    

    【讨论】:

    • 一流,提供准确的信息。将仔细阅读以尝试并准确了解它的工作原理。谢谢。
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多