我正在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_end
和calendar_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_start
和calendar_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),正确的语法是什么?
答案 0 :(得分:2)
您可以使用窗口功能。下面创建一个布尔值,而不是字符串:
SELECT d.*,
( 1 = row_number() over (order by calendar_week_end desc) ) as is_latest_week
FROM dates d;