求Databricks SQL查询语句:计算Finished projected date字段
需求与解决方案:Databricks SQL计算完成预计日期
输入表
| Load_date | projected_date | total demand | rolling consumed demand |
|---|---|---|---|
| 2020-01-01 | 2020-01-01 | 100 | 60 |
| 2020-01-01 | 2020-01-02 | 150 | 75 |
| 2020-01-01 | 2020-01-03 | 200 | 100 |
| 2020-01-01 | 2020-01-04 | 300 | 120 |
| 2020-01-01 | 2020-01-05 | 400 | 160 |
期望输出表
| Load_date | projected_date | total demand | rolling consumed demand | Finished projected date |
|---|---|---|---|---|
| 2020-01-01 | 2020-01-01 | 100 | 60 | 2020-01-03 |
| 2020-01-01 | 2020-01-02 | 150 | 75 | 2020-01-05 |
| 2020-01-01 | 2020-01-03 | 200 | 100 | --- |
| 2020-01-01 | 2020-01-04 | 300 | 120 | --- |
| 2020-01-01 | 2020-01-05 | 400 | 160 | --- |
计算逻辑
针对每条记录的total demand,找到第一个满足rolling consumed demand大于等于该值对应的projected_date;若不存在符合条件的日期,则显示---。
示例:
- 当
projected_date为2020-01-01时,total demand是100,rolling consumed demand在2020-01-03达到100,因此该记录的Finished projected date为2020-01-03; - 当
projected_date为2020-01-02时,total demand是150,rolling consumed demand在2020-01-05达到160(大于150),因此对应的Finished projected date为2020-01-05。
Databricks SQL查询语句
WITH demand_data AS ( SELECT Load_date, projected_date, `total demand`, `rolling consumed demand` FROM your_table_name -- 替换为你的实际表名 ) SELECT d1.Load_date, d1.projected_date, d1.`total demand`, d1.`rolling consumed demand`, COALESCE( MIN(d2.projected_date), '---' ) AS `Finished projected date` FROM demand_data d1 LEFT JOIN demand_data d2 ON d2.`rolling consumed demand` >= d1.`total demand` GROUP BY d1.Load_date, d1.projected_date, d1.`total demand`, d1.`rolling consumed demand` ORDER BY d1.projected_date;
语句说明
- 用CTE
demand_data封装原始数据,简化后续关联逻辑; - 通过自左关联匹配所有满足
rolling consumed demand≥当前记录total demand的行; - 用
MIN(d2.projected_date)筛选出最早符合条件的日期; - 用
COALESCE处理无匹配结果的场景,返回---; - 按
projected_date排序,保证结果顺序与期望一致。
内容的提问来源于stack exchange,提问作者Johnson
相关产品推荐
相关产品推荐

