仅获取具有最大组值的行

spu*_*pis 9 postgresql group-by greatest-n-per-group

例如,我们有:

element | group_value | value
a       | 1           | 2000
a       | 2           | 1500
a       | 2           | 2500
b       | 1           | 1000
Run Code Online (Sandbox Code Playgroud)

我只想返回最后 3 条记录,因为这些记录是每个元素具有最大组值的记录。

我知道有一个带有子查询的解决方案,但有没有一个有效的解决方案?

澄清:对于元素“a”:

2 是最高的 group_value,因此它返回第 2 行和第 3 行>(而不是第一行,因为它的组值不是最高的),

对于元素“b”:

1 是 > 最高的 group_value 所以它返回第 4 行

我的(性能不好)解决问题的方法是:

select * 
from   x x1 
where (element, group_value) in (select   element, max(group_value) 
                                 from     x x2 
                                 where    x1.element = x2.element 
                                 group by x2.element)
Run Code Online (Sandbox Code Playgroud)

McN*_*ets 12

第一个答案使用 CTE 选择 max(group_value) 然后加入表。

with maxgv as 
(
    select element, max(group_value) maxg
    from x
    group by element
)
select x.element, x.group_value, x.value
from   maxgv
inner join x
on         x.element = maxgv.element
and        x.group_value = maxgv.maxg
;
Run Code Online (Sandbox Code Playgroud)

这个使用 RANK() 函数:

with grp as 
 (
     select element, group_value, value,
            rank() over (partition by element order by element, group_value desc) rn
     from x
)
select element, group_value, value
from   grp
where  rn = 1;
Run Code Online (Sandbox Code Playgroud)

两者都返回相同的结果:

| element | group_value | value |
|---------|-------------|-------|
| a       | 2           | 1500  |
| a       | 2           | 2500  |
| b       | 1           | 1000  |
Run Code Online (Sandbox Code Playgroud)

雷克斯特在这里

但是,为了检查和比较性能,我们需要表模式。我不知道哪个索引正在使用您当前的查询。