Vertica - 在实际查询中无法识别 WITH 子句

Vertica - WITH clause is not recognized in actual query

请查看以下 Vertica SQL 代码:

   WITH date_range AS
    (SELECT YEAR(now() - interval '1' MONTH) ||MONTH(now() - interval '1' MONTH) ||'#'||DATE(TRUNC(now() - interval '1' MONTH, 'mm')) ||'#'||DATE(TRUNC(now(), 'mm') - interval '1' DAY)                              AS month1
              , YEAR(now() - interval '2' MONTH) ||MONTH(now() - interval '2' MONTH) ||'#'||DATE(TRUNC(now() - interval '2' MONTH, 'mm')) ||'#'||DATE(TRUNC(now() - interval '1' MONTH, 'mm') - interval '1' DAY) AS month2
    )
 SELECT regexp_substr(
    (SELECT month1
           FROM date_range), '[^#]*', 1, 1)

我有一个 420 行长的查询,我需要在我的代码中多次使用 "month1" 和 "month2" 作为变量。不幸的是,Vertica 仍然不支持变量,因此我尝试改用 WITH 子句。 不幸的是,它不起作用,因为我不断收到以下错误消息:

(4566) ERROR: Relation "date_range" does not exist

所以上帝(或 Stack Overflow)帮助我

我认为这是你想要的查询:

WITH date_range AS (
      SELECT YEAR(now() - interval '1' MONTH) ||MONTH(now() - interval '1' MONTH) ||'#'||DATE(TRUNC(now() - interval '1' MONTH, 'mm')) ||'#'||DATE(TRUNC(now(), 'mm') - interval '1' DAY)                              AS month1,
             YEAR(now() - interval '2' MONTH) ||MONTH(now() - interval '2' MONTH) ||'#'||DATE(TRUNC(now() - interval '2' MONTH, 'mm')) ||'#'||DATE(TRUNC(now() - interval '1' MONTH, 'mm') - interval '1' DAY) AS month2
    )
SELECT regexp_substr(month1, '[^#]*', 1, 1)
FROM date_range;

在实际查询中,您可以这样做:

SELECT regexp_substr(dr.month1, '[^#]*', 1, 1)
FROM date_range dr CROSS JOIN
     . . .;

我经常将此类 CTE 称为 params 以强调它们正在为查询提供参数。