0

さまざまなメンバーが参加しているレースエントリーテーブルがあります。これまでで最も多くのレースに出場したメンバーを知りたいです。どうすればこれを行うことができますか?SQL Developerを介してOracleを使用しているため、TOP 1機能しません。

4

5 に答える 5

2

最も効率的なアプローチは、一般的に分析関数を使用することです

SELECT member_no,
       cnt
  FROM (SELECT member_no, 
               count(*) cnt,
               rank() over (order by count(*) desc) rnk
          FROM race
         GROUP BY member_no)
 WHERE rnk = 1

クエリを実行することもできGROUP BY/ HAVINGますが、テーブルを2回ヒットする必要があり、race一般的に効率が低下します。

同点の場合に何をしたいですか?書かれているように、私が投稿したクエリはmember_no、テーブル内のほとんどのエントリに関連付けられている値が複数ある場合、複数の行を返しraceます。1つの値を任意に選択する場合は、ではなく分析関数member_noを使用できます。または、条項にいくつかの基準を追加して、同点を破る一意の順序があることを確認することもできます。row_numberrankorder by

于 2012-12-10T17:20:00.503 に答える
1

count()さて、あなたは集計を適用し、合計を取得することができるはずですgroup by member_no

select member_no, count(*) TotalEntries
from yourtable
group by member_no 
order by TotalEntries desc

次に、レコードを制限する場合は、次を使用できるようにする必要があります。

select member_no, TotalEntries
from
(
    select member_no, count(*) TotalEntries, row_number() over(order by count(*) desc) rn
    from yourtable
    group by member_no 
) src
where rn = 1
于 2012-12-10T17:18:10.740 に答える
0

次のようなものを試してください。

with
data as (
    -- Create some test data
    select distinct mod(rownum,20)+1 race_id, round(DBMS_RANDOM.VALUE(1,5)) member_id 
    from dual
    connect by level <= 100
)
-- real query starts here
select *
from (
    select member_id, count(*) race_count
    from data
    group by member_id
    order by race_count desc
)
where rownum <= 1;

注:これは、ほとんどのレースで複数のタイがあったとしても、1人のメンバーのみを返します。

于 2012-12-10T17:20:24.550 に答える
0
select member_id, races
  from (select member_id, count(*) races, rank() over (order by count(*) desc) rnk
          from your_table
         group by member_id)
 where rnk = 1;

ほとんどのレースに参加したすべてのメンバーを取得します。

于 2012-12-10T17:23:23.610 に答える
0

これを行う最も効率的な方法は、ウィンドウ/分析関数を使用しません。

select member_no, TotalEntries
from (select member_no, count(*) TotalEntries, rownum as seqnum
      from yourtable
      group by member_no 
      order by 2 desc
     ) t
where seqnum = 1
于 2012-12-10T18:41:36.303 に答える