如何在Left Join两表后基于Date列行号递增Value列?
如何基于日期行号实现值的递增关联?
现有表结构
Table1(实体初始值表)
| Entity | Value |
|---|---|
| A | 5 |
| B | 10 |
Table2(日期列表)
| Date |
|---|
| 1/1/2023 |
| 2/1/2023 |
| 3/1/2023 |
| 4/1/2023 |
| 5/1/2023 |
预期结果
| Entity | Value | Date |
|---|---|---|
| A | 5 | 1/1/2023 |
| A | 6 | 2/1/2023 |
| A | 7 | 3/1/2023 |
| A | 8 | 4/1/2023 |
| A | 9 | 5/1/2023 |
| B | 10 | 1/1/2023 |
| B | 11 | 2/1/2023 |
| B | 12 | 3/1/2023 |
| B | 13 | 4/1/2023 |
| B | 14 | 5/1/2023 |
解决方案
核心是通过**交叉连接(CROSS JOIN)**生成所有实体与日期的组合,再给日期排序生成行号,最后用初始值加上行号偏移量实现递增。
主流SQL方言写法(MySQL 8.0+/PostgreSQL/SQL Server)
SELECT t1.Entity, t1.Value + (ROW_NUMBER() OVER (ORDER BY t2.Date) - 1) AS Value, t2.Date FROM Table1 t1 CROSS JOIN Table2 t2 ORDER BY t1.Entity, t2.Date;
MySQL 5.x 兼容写法(无窗口函数支持)
SELECT t1.Entity, t1.Value + (t2.rn - 1) AS Value, t2.Date FROM Table1 t1 CROSS JOIN (SELECT Date, @row := @row + 1 AS rn FROM Table2, (SELECT @row := 0) r ORDER BY Date) t2 ORDER BY t1.Entity, t2.Date;
关键说明
- 必须在排序行号时指定
ORDER BY t2.Date,保证日期顺序正确,否则递增逻辑会混乱 - 交叉连接会生成Table1与Table2的笛卡尔积,即每个实体对应所有日期,这是实现需求的基础
- 行号减1是为了让第一行日期对应初始值,后续每行依次加1
内容的提问来源于stack exchange,提问作者CodeMaster
相关产品推荐
相关产品推荐

