Postgresql
僅獲取具有最大組值的行
例如,我們有:
element | group_value | value a | 1 | 2000 a | 2 | 1500 a | 2 | 2500 b | 1 | 1000
我只想返回最後 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)
第一個答案使用 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 ;
這個使用 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;
兩者都返回相同的結果:
| element | group_value | value | |---------|-------------|-------| | a | 2 | 1500 | | a | 2 | 2500 | | b | 1 | 1000 |
但是,為了檢查和比較性能,我們需要表模式。我不知道哪個索引正在使用您目前的查詢。