web-dev-qa-db-ja.com

最大グループ値を持つ行のみを取得

たとえば、次のようになります。

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)
8
spuppis

最初の答えは、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  |

レステスター ここ

ただし、パフォーマンスを確認して比較するには、テーブルスキーマが必要です。現在のクエリを使用しているインデックスがわかりません。

11
McNets