有没有一种方法可以返回SQL中column的最大值?

时间:2020-09-13 16:31:21

标签: sql postgresql

如果我有桌子...

name | day | showers
-----|-----|--------
John | mon | 1
John | tue | 2
John | wed | 1
Pete | fri | 3

我想归还每人每天淋浴最多的桌子...

name | day | showers
-----|-----|--------
John | tue | 2
Pete | fri | 3

我该怎么做?

我认为我可以做...

SELECT name, day FROM table GROUP BY name WHERE showers=max(showers)

但是由于一天不在group by子句中,所以出现语法错误

3 个答案:

答案 0 :(得分:2)

使用distinct on

select distinct on (name) t.*
from t
order by name, showers desc;

每个名称仅返回一行。如果要在有关系时重复,则使用rank()dense_rank()

select t.*
from (select t.*,
             rank() over (partition by name order by showers desc) as seqnum
      from t
     ) t
where seqnum = 1;

答案 1 :(得分:1)

您可以使用uncorrelated subquery。这样也会保持联系

select *
from t 
where (name, showers) in (select name, max(showers)
                          from t
                          group by name);

也可以表示为correlated subquery

select *
from t t1
where showers= (select max(t2.showers)
                from t t2
                where t1.name=t2.name);

答案 2 :(得分:0)

您可以使用以下查询:

SELECT name, days, showers
FROM test
WHERE showers =
(SELECT max(showers) FROM test i WHERE i.name = test.name)

相关子查询是一种读取表中每一行并将每行中的值与相关数据进行比较的一种方法。每当子查询必须为主查询所考虑的每个候选行返回不同的结果或结果集时,就使用它。换句话说,您可以使用相关子查询来回答一个多部分问题,该问题的答案取决于父语句处理的每一行中的值。

So from the original table you get this result

因此,通过运行此查询,从左侧的原始表中获得结果,在右侧的表中