考虑如下的简单表:
CREATE TABLE example_groups(
id SERIAL PRIMARY KEY,
value1 INT NOT NULL,
value2 INT NOT NULL,
user_name TEXT NOT NULL
);
包含一些行:
INSERT INTO example_groups(value1, value2, user_name) VALUES(3, 1, 'Tom');
INSERT INTO example_groups(value1, value2, user_name) VALUES(5, 2, 'Tom');
INSERT INTO example_groups(value1, value2, user_name) VALUES(1, 3, 'Tom');
INSERT INTO example_groups(value1, value2, user_name) VALUES(40, 10, 'John');
INSERT INTO example_groups(value1, value2, user_name) VALUES(1, 11, 'John');
我有以下查询要按user_name
列的表分组:
SELECT SUM(value1), SUM(value2), MAX(value2)
FROM example_groups
GROUP BY user_name;
结果返回的内容我将其插入另一个表(查询为INSERT SELECT
)。
我想在代码中返回MAX
列中所有行的最大值。到目前为止,我一直使用RETURNING
语句执行此操作,但是当我尝试在此处使用它时,我收到错误。
在这种情况下使用RETURNING
语句的正确方法是什么?
查询失败的示例:
SELECT SUM(value1), SUM(value2), MAX(value2) AS max2
FROM example_groups
RETURNING (MAX(max2))
GROUP BY user_name;
我正在使用postgres。
答案 0 :(得分:1)
我对Postgres语法不太熟悉,但基于文档,似乎RETURNING语句为每行插入的每行返回/计算值,因此使用聚合函数(MAX) )在每一行的基础上没有任何意义。
可能有更优雅的方式编写查询,但这应该足够了(假设我没有语法错误):
SELECT SUM(value1), SUM(value2), MAX(value2) AS max_all_groups
FROM example_groups
GROUP BY user_name
ORDER BY max_all_groups DESC -- order from highest to lowest maximum value per user
LIMIT 1 -- get top row
显然,如果您只是希望为INSERT INTO语句返回的所有组中的最大值,而不关心SUM(...)列,则可以删除它们。
我希望有帮助,毫无疑问更有经验的Postgres用户将能够纠正我的上述情况。
答案 1 :(得分:0)
试试这个
with cte as
(
SELECT SUM(value1) as sum1, SUM(value2) as sum1 , MAX(value2) as maxValue2
FROM example_groups
GROUP BY user_name
)
select * from cte where maxvalue2 = (select max(maxValue2) from cte)
或
with cte as
(
SELECT SUM(value1) as sum1, SUM(value2) as sum1 , MAX(value2) as maxValue2
FROM example_groups
GROUP BY user_name
)
select max(maxValue2) as max_Of_all from cte