2016-08-07 2 views
0

私は3つのテーブル - イベント、メンバー、ランクを持っています。私は、特定のイベント(ex EV01)のために、(RANKからの)最良の結果とそれが所属するメンバーを表示する必要があります。これを行う最も簡単な方法は何ですか?下のコードは最低の数字を選択しているようですが、自分自身を複製し、他のメンバーが同じ結果を得ていると主張します。テーブル内のカラムから最低番号を検索

予想される出力:

EVENT_ID EVENT_TYPE EVENT_NAME MEMBER_ID MEMBER_NAME RESULT 
event01  swimming  100m   mem001  John Smith  10 

コードこれまで:

SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, R.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, (SELECT MIN(RESULT) 
FROM RANK WHERE E.EVENT_ID = 'EVENT003') AS AVG_INCOME_ALL_CLUBS 
FROM EVENT E, RANK R, MEMBER M 
WHERE E.EVENT_ID = R.EVENT_ID 
AND R.MEMBER_ID = M.MEMBER_ID 
ORDER BY MEMBER_ID; 
+0

は、すべてのイベントが勝者を持っていませんか?なぜR.RESULT = 1でフィルタリング(WHERE句を使用)できないのですか? – mathguy

答えて

0

まず、明示的なJOIN構文を使用することを学びます。

第二には、あなたの質問への答えはROW_NUMBER()次のとおりです。

SELECT * 
FROM (SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, R.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, 
      ROW_NUMBER() OVER (PARTITION BY E.EVENT_ID ORDER BY R.RESULT ASC) as SEQNUM 
     FROM EVENT E, JOIN 
      RANK R 
      ON E.EVENT_ID = R.EVENT_ID JOIN 
      MEMBER M 
      ON R.MEMBER_ID = M.MEMBER_ID 
    ) ERM 
WHERE SEQNUM = 1 
ORDER BY MEMBER_ID; 
+1

ネクタイの場合、 'ROW_NUMBER'が任意に1つを選ぶので、' RANK'を使うほうが良いかもしれません。 –

+0

@JeffreyKemp。 。 。ネクタイの場合に重複が必要な場合は、 'rank()'または 'dense_rank()'を使用します。 –

+0

はい、それはまさに私の指摘でした... –

0
SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, R.MEMBER_ID,M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, 
FROM EVENT E, JOIN 
     RANK R 
     ON E.EVENT_ID = R.EVENT_ID JOIN 
     MEMBER M 
     ON R.MEMBER_ID = M.MEMBER_ID 
     where R.RESULT= 
(SELECT MIN(RESULT) FROM RANK WHERE E.EVENT_ID = 'EVENT003') AND R.EVENT_ID='EVENT003';