如何为SQL查询结果添加0-23的hour列并重复每行24次?
实现每行数据与0-23小时的笛卡尔关联查询
核心思路是生成一个包含0到23所有小时值的临时数据集,再和原表做交叉连接(CROSS JOIN),让原表每行数据与24个小时值逐一匹配,达到每行重复24次的效果。以下是主流数据库的具体实现方式:
MySQL/MariaDB
通过UNION ALL手动构造小时序列:
SELECT t.column_1, t.column_2, t.column_3, h.hour FROM `table` t CROSS JOIN ( SELECT 0 AS hour UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 ) h;
PostgreSQL
利用内置的generate_series函数快速生成序列:
SELECT t.column_1, t.column_2, t.column_3, h.hour FROM "table" t CROSS JOIN generate_series(0, 23) AS h(hour);
SQL Server
通过VALUES子句构造小时序列:
SELECT t.column_1, t.column_2, t.column_3, h.hour FROM [table] t CROSS JOIN ( VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23) ) AS h(hour);
注意事项
- 交叉连接会返回两个数据集的笛卡尔积,正好满足原表每行对应24个小时值的需求。
- 请将SQL中的
table替换为你的实际表名,不同数据库对表名/列名的引号规则不同(MySQL用反引号,PostgreSQL用双引号,SQL Server用方括号)。
内容的提问来源于stack exchange,提问作者Ya Xiao
相关产品推荐
相关产品推荐

