如何用SAS PROC SQL实现无连接ID的日期表与时间表的左连接生成笛卡尔积?
实现日期与时间的全量配对(笛卡尔积)
这个需求本质上是要生成两个表的笛卡尔积——让日期表中的每一个日期,都和时间表中的每一个时间点逐一配对,正好满足每个日期对应所有391个时间点的要求。因为两个表没有关联字段,我们可以用以下几种方式实现:
方法1:使用标准SQL的CROSS JOIN(推荐)
CROSS JOIN是SQL中专门用来生成两个表笛卡尔积的语法,语义清晰,性能也最优。假设你的日期表名为date_table(字段date_col存储YYYYMMDD格式日期),时间表名为time_table(字段time_col存储HH:MM:SS格式时间),代码如下:
SELECT d.date_col AS date, t.time_col AS time FROM date_table d CROSS JOIN time_table t ORDER BY d.date_col, t.time_col;
执行后会直接输出所有日期与时间的组合,最后通过ORDER BY按日期和时间排序,就能得到你预期的输出格式。
方法2:用LEFT JOIN模拟笛卡尔积
如果你的数据库版本不支持显式CROSS JOIN(这种情况很少见),可以用LEFT JOIN加上一个恒真的连接条件(比如1=1)来实现同样的效果:
SELECT d.date_col AS date, t.time_col AS time FROM date_table d LEFT JOIN time_table t ON 1=1 ORDER BY d.date_col, t.time_col;
这里的1=1条件永远成立,所以每个日期行都会和时间表的所有行进行匹配,结果和CROSS JOIN完全一致。
方法3:MySQL特有的简写方式
在MySQL中,你还可以用逗号分隔两个表的写法来代替CROSS JOIN,效果相同:
SELECT d.date_col AS date, t.time_col AS time FROM date_table d, time_table t ORDER BY d.date_col, t.time_col;
不过这种写法的可读性不如显式的CROSS JOIN,建议优先使用第一种方法。
验证数据量
2000年是闰年,共有366个日期,乘以391个时间点,最终结果应该是366 * 391 = 143106行,符合预期。
内容的提问来源于stack exchange,提问作者eternity1
相关产品推荐
相关产品推荐

