返回所有组的最大值?

时间:2014-07-25 08:28:55

标签: sql postgresql

考虑如下的简单表:

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。

2 个答案:

答案 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