如何通过SQL从事件数据流生成维度表?(列存库场景)
从事件流表生成维度表的SQL实现
需求:通过SQL查询从事件流数据表生成维度表,记录每个汽修店属性的生效时间段。
原事件流表(bodyshops)
| event_id | bodyshop_name | time | phone_number | address |
|---|---|---|---|---|
| 1 | Body1 | 2022-10-05 11:30 | 12345 | abc |
| 2 | Body1 | 2022-10-05 11:35 | 56789 | abc |
| 3 | Body2 | 2022-10-05 11:36 | 34563 | def |
目标维度表结构及数据
| bodyshop_name | phone_number | address | start_time | end_time |
|---|---|---|---|---|
| Body1 | 12345 | abc | 2022-10-05 11:30 | 2022-10-05 11:35 |
| Body1 | 56789 | abc | 2022-10-05 11:35 | Null |
| Body2 | 34563 | def | 2022-10-05 11:36 | Null |
实现SQL语句
SELECT bodyshop_name, phone_number, address, time AS start_time, LEAD(time) OVER (PARTITION BY bodyshop_name ORDER BY time) AS end_time FROM bodyshops ORDER BY bodyshop_name, start_time;
逻辑说明
- 使用
LEAD()窗口函数,按bodyshop_name分组、time升序排序,获取同一家汽修店下一条事件记录的时间,作为当前属性记录的end_time; - 若为同一家店的最后一条记录,
LEAD()返回NULL,对应维度表中end_time为Null,表示该属性当前仍生效; - 最终结果按汽修店名称和生效时间排序,与目标维度表结构一致。
内容的提问来源于stack exchange,提问作者Catazza
相关产品推荐
相关产品推荐

