【发布时间】:2019-11-14 08:44:23
【问题描述】:
我有一个表格,每次更改某个位置的分数时都会记录一行。
score_history:
- id int PK(uuid 自动递增 int)
- happened_at 时间戳(分数发生变化时)
- location_id int FK(值所针对的位置)
- 分数浮动(新分数)
这样做是着眼于效率,并且能够简单地检索给定位置的更改列表并很好地服务于该目的。
我正在尝试以非常冗余的格式输出数据,以帮助将其加载到严格的外部系统中。外部系统期望每个位置 * 每个日期都有一行。目标是表示每个日期每个位置的最后一个分数值。因此,如果分数在给定日期更改了 3 次,则只有最接近午夜的分数才会被视为当天的收盘分数。我想这类似于创建关闭业务库存水平事实表的挑战。
我有一个方便的星型样式日期维度表,其中每个日期都有一行,完全涵盖了这个样本期间和未来。
那张桌子看起来像
dw_dim_date:
- 日期日期PK
- 一堆其他列,例如周数、is_us_holiday 等。
所以,如果我在 score_history 表中只有 3 条记录...
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 要求:
- 每个位置每天一行,即使没有得分记录 那天。
- 如果有最后一天的得分记录 午夜前的一个应该是该行的分数值。如果出现平局,则两者中的较大者应该“获胜”。
- 如果当天的分数记录为零,则分数应为最近的先前分数。
我一直在通过子查询和窗口函数追逐我的尾巴。
因为我不愿意发布没有我尝试过的东西我会分享这个产生输出但没有意义的火车失事......
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'
感谢您提供其他阅读问题的指导或指针。
【问题讨论】:
-
我不是在一天之内寻找 MAX 值。我正在寻找一天的最后一个值。而且很多天根本没有价值。
-
1) 每个位置每天一行,即使当天没有得分记录。 2)如果有当天的得分记录,则午夜前的最后一个应该是该行的得分值 3)如果当天的得分记录为零,那么得分应该是最近的上一个得分。
标签: sql postgresql data-warehouse postgresql-9.3