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)
两者都返回相同的结果:
Run Code Online (Sandbox Code Playgroud)| element | group_value | value | |---------|-------------|-------| | a | 2 | 1500 | | a | 2 | 2500 | | b | 1 | 1000 |
雷克斯特在这里
但是,为了检查和比较性能,我们需要表模式。我不知道哪个索引正在使用您当前的查询。
归档时间: |
|
查看次数: |
26673 次 |
最近记录: |