Postgresql

僅獲取具有最大組值的行

  • November 3, 2018

例如,我們有:

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  |

這裡重新測試

但是,為了檢查和比較性能,我們需要表模式。我不知道哪個索引正在使用您目前的查詢。

引用自:https://dba.stackexchange.com/questions/171938