如何改写Vertica SQL查询实现批量日期处理无需每日执行?
改写后的批量处理SQL
直接用以下查询即可实现日期范围的批量处理,只需修改BETWEEN逻辑对应的起止日期:
INSERT INTO TABLE_4 SELECT dates.day_ AS DAY_, s.ID AS ID, s.NAME AS NAME, addr.ADDRESS AS ADDRESS, NVL(hw.HOMEWORK_PROGRESS, 0.0) AS PROGRESS FROM -- 生成指定日期范围内的所有日期 (SELECT GENERATE_SERIES( TO_DATE('2023-11-01', 'YYYY-MM-DD'), TO_DATE('2023-11-30', 'YYYY-MM-DD'), INTERVAL '1 day' )::DATE AS day_ ) AS dates -- 交叉连接所有学生和地址,确保每个日期都对应所有学生 CROSS JOIN STUDENTS AS s INNER JOIN ADDRESS AS addr ON s.ID = addr.ID -- 左连接作业表,匹配学生ID和日期 LEFT JOIN HOMEWORK AS hw ON s.ID = hw.ID AND hw.DAY = dates.day_;
关键修改说明:
- 批量生成日期:用Vertica原生的
GENERATE_SERIES函数自动生成目标时间段内的所有日期,替代原查询中硬编码的单日期 - 全覆盖组合:通过
CROSS JOIN让每个日期都与所有学生(关联地址)形成组合,满足"所有日期+所有学生"的输出要求 - 动态日期匹配:左连接条件直接关联生成的日期,无需手动修改多处日期参数
- 统一别名:调整为清晰的别名(
s代表学生、addr代表地址、hw代表作业表),修正原查询中别名不匹配的问题
后续只需修改GENERATE_SERIES里的起止日期,就能批量处理任意时间段的数据,不用每日手动调整查询。
内容的提问来源于stack exchange,提问作者Zaw Lynn Htut
相关产品推荐
相关产品推荐

