「テーブル」のカウントで、「時間」で上位3の「ユーザーID」を検索する必要があります。入力と出力の例:グループごとに最大のカウントを持つ上位3つのIDを見つける - トリプルネストされたクエリを避けることは可能ですか?
表
ID UserID Time
1 A '1'
2 A '1'
3 B '2'
4 B '4'
5 B '4'
etc
望ましい結果:
Time UserID Number Rank
'1' A 17 1
'1' C 11 2
'1' Q 9 3
'2' B 13 1
'2' C 9 2
'2' M 7 3
etc
私は三重のクエリを使用してこれを実現することができましたが、簡素化する方法はありますか?そうでない場合は非常に遅くなり、このように思えるので、「を有する」節のようなものが、ここに適用できるかどう
select userID, Number, time, Rank from (
select userID, Number, time,
Rank() over (partition by time order by Number DESC) as Rank
from
(select count(distinct(ID)) as Number,
userID,
time from table
group by 2, 3)
)
where Rank <= 3
は、私は思ったんだけど。
あなたが提供するサンプルデータと希望の結果がお互いに一致する場合は、通常、必要なものを理解するのに役立ちます。さらに、クエリが正しい結果を生成する場合は、何が問題なのでしょうか?それは遅すぎますか?次に、既存のクエリのテーブル構造、インデックス、データカーディナリティ、および生成された実行計画に関する詳細情報を提供します。 –
@VladimirBaranovより直接的なアプローチが利用可能な場合、クエリ自体をよりエレガントにすることを望んでいます。 –
関連していないが: 'distinct'は***ではない***関数である。そして実際のクエリを投稿してください。あなたの質問のクエリは無効な構文です - 選択リストの 'rank(....) '部分が正しくなく、メインクエリに' from'がありません –