如何基于另一张表的日期匹配重复表行,使每个ID对应完整日期序列
需求说明
需要将Table A转换为Table C:为每个id补全Table B日期列中的所有日期,原Table A中没有对应日期的行,Amount字段填充null,最终每个id对应的行数与Table B的日期数量一致。
原始表Table A
| id | Dates | Amount |
|---|---|---|
| 1 | 01/09/2010 | 4 |
| 1 | 01/03/2011 | 3 |
| 2 | 01/12/2011 | 3 |
| 3 | 01/03/2011 | 1 |
| 3 | 01/06/2011 | 1 |
| 3 | 01/09/2011 | 1 |
日期参考表Table B
| Dates |
|---|
| 01/09/2010 |
| 01/12/2010 |
| 01/03/2011 |
| 01/06/2011 |
| 01/09/2011 |
目标表Table C
| id | Dates | Amount |
|---|---|---|
| 1 | 01/09/2010 | 4 |
| 1 | 01/12/2010 | null |
| 1 | 01/03/2011 | 3 |
| 1 | 01/06/2011 | null |
| 1 | 01/09/2011 | null |
| 2 | 01/09/2010 | null |
| 2 | 01/12/2010 | null |
| 2 | 01/03/2011 | 3 |
| 2 | 01/06/2011 | null |
| 2 | 01/09/2011 | null |
| 3 | 01/09/2010 | null |
| 3 | 01/12/2010 | null |
| 3 | 01/03/2011 | 1 |
| 3 | 01/06/2011 | 1 |
| 3 | 01/09/2011 | 1 |
实现方法(SQL)
通过生成所有id与Table B日期的笛卡尔积,再左连接原Table A获取对应Amount值,未匹配的自动填充null,代码如下:
-- 生成所有id与日期的全组合 WITH all_id_dates AS ( SELECT DISTINCT a.id, b.Dates FROM TableA a CROSS JOIN TableB b ) -- 左连接匹配原始数据,补全缺失值 SELECT aid.id, aid.Dates, a.Amount FROM all_id_dates aid LEFT JOIN TableA a ON aid.id = a.id AND aid.Dates = a.Dates ORDER BY aid.id, aid.Dates;
逻辑说明
CROSS JOIN生成每个id与Table B中所有日期的组合,确保每个id都覆盖所有需要的日期;LEFT JOIN关联原Table A,只有当id和日期都匹配时才会获取到Amount,否则为null;- 最后按id和日期排序,得到与Table C一致的结果。
内容的提问来源于stack exchange,提问作者HaagenDaz
相关产品推荐
相关产品推荐

