2016-08-08 14 views
0

次のクエリから最初の行のみを戻すことができません。私はうまく動作する特定のEVENTのRESULT列の中で最も低い値を返そうとしていますが、他の行も返します。これを達成する最良の方法は何ですか?だから、行のresultあなたはイベントの最小resultを表示するとともに最低値を選択して最初の行のみを返します

SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, M.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, (SELECT MIN(RESULT) 
FROM RANK) 
FROM EVENT E JOIN 
RANK R 
ON E.EVENT_ID = R.EVENT_ID JOIN 
MEMBER M 
ON M.MEMBER_ID = R.MEMBER_ID 
WHERE E.EVENT_ID = 'EVENT001' 
ORDER BY RESULT; 

答えて

1

以下の溶液中でのサブクエリをコピーし、元のポストから貼り付けられます(私はあなたのテーブルを持っていなかったので、明らかに)、私はそれをテストしていない、余分なフィールドを除きます:MIN(RESULT ...)の代わりにROW_NUMBER()OVER ....

これは、指定された順序(注意事項DESC)を使用して各 "パーティション"に行を割り当て、外側のクエリで行を選択しますこのrow_numberは1に等しい。

SELECT EVENT_ID, EVENT_TYPE, EVENT_NAME, MEMBER_ID, 
     MEMBER_FIRSTNAME, MEMBER_LASTNAME, RESULT 
FROM 
(
    SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, 
      M.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, 
      R.RESULT, 
      row_number() over (partition by e.event_id order by r.result) as rn 
    FROM EVENT E JOIN 
      RANK R 
      ON E.EVENT_ID = R.EVENT_ID JOIN 
      MEMBER M 
      ON M.MEMBER_ID = R.MEMBER_ID 
    WHERE E.EVENT_ID = 'EVENT001' 
) 
WHERE RN = 1; 

これは、たとえ最も低い得点のための同点があっても、1列になります。ネクタイがある場合、選択される行は未定です(少なくともこのソリューションでは、ORDER BYに句を追加できます)。同調の場合に、結束されたメンバーをすべて一覧にする場合は、ROW_NUMBER()の代わりにDENSE_RANK()を使用できます。

+0

これは無効なテーブル名を返します。どうして? –

+0

どのテーブル名が無効であるかを教えてくれますか?私のフロントエンドは、SLQ * Plus、SQL Developer、Toadのいずれを使用しても、常にそうです。 – mathguy

+0

私はOracle Application Expressを使用していますが、残念ながらそれはありません。 –

0

。このためMIN OVERを使用します。

select 
    e.event_id, 
    e.event_type, 
    e.event_name, 
    m.member_id, 
    m.member_firstname, 
    m.member_lastname, 
    r.result, 
    min(r.result) over() as min_result 
from event e 
join rank r on e.event_id = r.event_id 
join member m on m.member_id = r.member_id 
where e.event_id = 'EVENT001' 
order by r.result; 
+0

申し訳ありませんが、私は両方ではなく、最小限の結果を表示したかっただけです。私はこの部分を編集しました。 –

+0

OPは、結果が最も低いメンバーの名前のみを返したいとします。だから、あなたは外側のクエリ内でこのクエリをラップし、 'result = min_result'でフィルタリングする必要があります。 – mathguy

+0

@James B:これは別の仕事です。 mathguyの言うとおり、これを外側のクエリで囲みます。 'min over'の代わりに' rank'(または 'dense_rank')を使うこともできます。しかし、最も簡単な方法は、 'FETCH FIRST 1 ROW WITH TIES'を追加することですが、これはOracle 12c以降でのみ利用可能です。 –

関連する問題