Давайте представим, что у нас есть таблица 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' )
)
Я не могу обернуться, как вернуть данные, которые бы указывали, сколько активных совпадений есть в каждой неделе с точки в прошлом до этой недели.