PostgreSQL 9.6:将查询结果存入变量并在另一查询中使用
修正你的PostgreSQL销量查询代码
嘿,我看你想用PostgreSQL 9.6获取销量最高日期的所有销售数据,思路是对的,但代码里有几个语法和逻辑细节需要调整,我来帮你梳理下~
原代码的问题
- 变量赋值语法错误:给
max_sales_date赋值时,select语句必须用括号包裹,否则PostgreSQL会报语法错误。 - DO块无法直接返回查询结果:DO语句块是用来执行无返回值的过程式逻辑的,里面的
select * from Sales...不会输出任何结果,得换一种方式获取数据。
解决方案一:修正DO块并通过临时表获取结果
如果必须用变量和过程式代码,我们可以修正赋值语法,同时用临时表存储查询结果,之后再查询临时表拿到数据:
DO $$ DECLARE max_sales_date DATE ; BEGIN -- 给select语句添加括号,完成变量赋值 max_sales_date := ( select sales_date::date from ( select count(sales_date::date) , sales_date::date , row_number() over (order by count(sales_date::date) desc) as rn from Sales group by sales_date::date ) a where a.rn = 1 ); -- 用临时表存储目标数据 CREATE TEMP TABLE IF NOT EXISTS top_sales_day_data AS SELECT * FROM Sales WHERE sales_date = max_sales_date; -- 可选:输出销量最高的日期 RAISE NOTICE '销量最高的日期是: %', max_sales_date; END $$ ; -- 查询临时表获取最终结果 SELECT * FROM top_sales_day_data;
解决方案二:用CTE简化查询(更推荐)
其实如果只是为了获取销量最高日期的销售数据,完全不需要用DO块和变量,用公共表表达式(CTE)就能一步完成,代码更简洁高效:
WITH top_sales_date AS ( select sales_date::date from ( select count(sales_date::date) , sales_date::date , row_number() over (order by count(sales_date::date) desc) as rn from Sales group by sales_date::date ) a where a.rn = 1 ) SELECT s.* FROM Sales s JOIN top_sales_date tsd ON s.sales_date = tsd.sales_date;
额外优化:处理并列最高的情况
如果有多个日期的销量并列最高,row_number()只会返回其中一个日期。如果你想把所有销量最高的日期都包含进来,可以把row_number()换成rank():
WITH top_sales_date AS ( select sales_date::date from ( select count(sales_date::date) , sales_date::date , rank() over (order by count(sales_date::date) desc) as rn from Sales group by sales_date::date ) a where a.rn = 1 ) SELECT s.* FROM Sales s JOIN top_sales_date tsd ON s.sales_date = tsd.sales_date;
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

