尝试使用if / else子句创建新列时发生SQL语法错误

时间:2019-07-16 18:15:56

标签: sql postgresql

我正在PostgreSQL v9.6中使用此架构:

CREATE TABLE dates (
  calendar_week_start timestamp,
  calendar_week_end timestamp,
  calendar_year integer,
  calendar_year_category varchar(255)
);

INSERT INTO dates (calendar_week_start, calendar_week_end, calendar_year, calendar_year_category)
VALUES ((DATE'2018-01-01'), (DATE'2018-01-07'), 2018, 'Prior Year'), 
       ((DATE'2018-01-08'), (DATE'2018-01-14'), 2018, 'Prior Year'), 
       ((DATE'2018-01-15'), (DATE'2018-01-21'), 2018, 'Prior Year'),
       ((DATE'2018-01-22'), (DATE'2018-01-28'), 2018, 'Prior Year'),
       ((DATE'2019-01-01'), (DATE'2019-01-07'), 2019, 'Current Year'), 
       ((DATE'2019-01-08'), (DATE'2019-01-14'), 2019, 'Current Year'), 
       ((DATE'2019-01-15'), (DATE'2019-01-21'), 2019, 'Current Year'),
       ((DATE'2019-01-22'), (DATE'2019-01-28'), 2019, 'Current Year');

我正在尝试运行此查询来创建一个名为“ latest_week”的列,该列应同时检查calendar_week_endcalendar_year_category字段以确定日期是否为表中的最后一周,并指定“是”或“否”的值。

每当我尝试比较两个存在的“虚拟”查询时,查询都会按预期运行。每当我尝试使用MAX(calendar_week_end)将日期值与最大日期值进行比较时,查询就会引发错误。

下面是一个这样的查询,它返回意外错误(未给出其他信息)。

SELECT calendar_week_end GROUP BY calendar_year_category,
    CASE
        WHEN calendar_week_end=MAX(calendar_week_end) THEN 'Yes'
        ELSE 'No'
    END
    AS latest_week
FROM dates;

但是,如果我仅通过比较calendar_week_startcalendar_week_end来运行此“虚拟”查询,则语法相同,并且我得到新列latest_week,其所有值都为'No'预期的。

SELECT calendar_week_start, calendar_year_end GROUP BY calendar_week_category,
    CASE
        WHEN calendar_week_start=calendar_week_end THEN 'Yes'
        ELSE 'No'
    END
    AS latest_week
FROM dates;

如果我要在查询中使用MAX(calendar_week_end),正确的语法是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用窗口功能。下面创建一个布尔值,而不是字符串:

SELECT d.*,
       ( 1 = row_number() over (order by calendar_week_end desc) ) as is_latest_week
FROM dates d;