Нам нужно каждый день извлекать конволюцию с момента прошлого и до настоящего времени со списком булевых переходов устройства с метками времени. Окончательный вывод должен представлять собой таблицу, в которой есть запись date: device_id для каждого дня, когда он находится в сети (в противном случае записи на эту дату нет).
Вот пример таблицы переходов для одного устройства:
![Device Transition Table](https://i.stack.imgur.com/UdBVL.png)
Чтобы создать календарь свертки:
calendar AS (
SELECT day
FROM UNNEST (GENERATE_DATE_ARRAY('2011-05-15', CURRENT_DATE())) AS day
),
Затем, чтобы сгенерировать хотя бы таблицу, в которой есть только даты перехода ПОСЛЕ события перехода, чтобы впоследствии их можно было ранжировать и выбирать последним (CROSS JOIN здесь - чёрт!):
joined_with_cal AS (
SELECT
cal.day as online_date,
otr.when_changed,
otr.device_id,
otr.is_online,
otr.rank_by_date
FROM
calendar AS cal
CROSS JOIN
ordered_transitions otr
WHERE
cal.day >= DATE(otr.when_changed)
),
Затем код, который пытается ранжировать и выбирать самую последнюю запись в разделе по метке времени (when_changed или ranked_by_date - ни один из них, похоже, не работает):
SELECT
online_date,
when_changed,
device_id,
is_online,
rank_by_date,
FROM (
SELECT
online_date,
when_changed,
device_id,
is_online,
rank_by_date,
RANK() OVER (PARTITION BY device_id ORDER BY rank_by_date ASC) as final_rank
FROM
joined_with_cal
)
WHERE
final_rank = 1 AND
-- online_date < '2017-08-01' AND
device_id = 419609
ORDER BY
online_date,
when_changed,
device_id
Однако, это не работает и, очевидно, ужасно.
Может кто-нибудь предложить правильное, элегантное решение?
Заранее спасибо!