たとえば、次のようになります。
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 |
レステスター ここ
ただし、パフォーマンスを確認して比較するには、テーブルスキーマが必要です。現在のクエリを使用しているインデックスがわかりません。