Как отследить рост неделей за неделей с учетом недостающих недель - PullRequest
0 голосов
/ 10 января 2019

Давайте представим, что у нас есть таблица 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' )
        )

Я не могу обернуться, как вернуть данные, которые бы указывали, сколько активных совпадений есть в каждой неделе с точки в прошлом до этой недели.

1 Ответ

0 голосов
/ 10 января 2019

Это может быть то, что вы ищете.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...