У меня есть таблица, в которой записывается строка для каждого изменения оценки местоположения.
счет_истории:
- id int PK (uuid с автоматическим приращением int)
- произошло_временная отметка (когда счет изменился)
- location_id int FK (местоположение, для которого значение)
- счет с плавающей точкой (новый счет)
Это было сделано с учетом эффективности и возможности просто получить список изменений для заданного местоположения и прекрасно подходит для этой цели.
Я пытаюсь вывести данные в очень избыточном формате дляпомочь загрузить его в жесткую внешнюю систему.Внешняя система ожидает строку для каждого местоположения * каждую дату.Цель состоит в том, чтобы представить последнее значение оценки для каждого местоположения для каждой даты.Таким образом, если оценка изменялась 3 раза за определенную дату, только оценка, ближайшая к полуночи, будет считаться закрывающей счетом за день.Я полагаю, что это похоже на задачу создания таблицы фактов уровня инвентаризации бизнеса.
У меня есть удобная таблица измерений даты в виде звездообразной схемы, в которой есть строка для каждой даты, полностью охватывающая этот примерный период, ибудущее.
Эта таблица выглядит как
dw_dim_date:
- дата дата PK
- куча других столбцов, таких как номер недели, is_us_holiday и т. д..
Итак, если бы у меня было только 3 записи в таблице Score_history ...
1, 2019-01-01:10:13:01, 100, 5.0
2, 2019-01-05:20:00:01, 100, 5.8
3, 2019-01-05:23:01:22, 100, 6.2
Желаемый результат был бы:
2019-01-01, 100, 5.0
2019-01-02, 100, 5.0
2019-01-03, 100, 5.0
2019-01-04, 100, 5.0
2019-01-05, 100, 6.2
3Требования:
- Одна строка в день для каждого местоположения, даже если для этого дня нет записей о результатах.
- Если есть записи о результатах за этот день, последняя до полуночи должна бытьоценка значения для строки.В случае ничьей старший из них должен «выиграть».
- Если в этот день есть записи с нулевым счетом, счет должен быть самым последним предыдущим счетом.
Я гонялся за своим хвостом через подзапросы и оконные функции.
Поскольку я не решаюсь публиковать что-то без чего-либо, я попытался поделиться этим trainwreck, который производит вывод, но не имеет смысла ...
SELECT dw_dim_date.date,
(SELECT score
FROM score_history
WHERE score_history.happened_at::DATE < dw_dim_date.date
OR score_history.happened_at::DATE = dw_dim_date.date
ORDER BY score_history.id desc limit 1) as last_score
FROM dw_dim_date
WHERE dw_dim_date.date > '2019-06-01'
Благодарен за руководство или ссылки на другие вопросы для чтения.