2016-08-07 3 views
0

У меня есть 3 стола - EVENT, MEMBER, RANK. Мне нужно показать лучший результат (из RANK) вместе с членом, к которому он принадлежит, для конкретного события (ex EVENT01). Каков самый простой способ сделать это? Мой код ниже, кажется, выбирает самое низкое число, но дублирует себя и утверждает, что другие члены получили тот же результат.Найти самое низкое число из столбца в таблице

Ожидаемый результат:

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

ли не каждое событие есть победитель? Почему вы не можете просто фильтровать (использовать предложение WHERE) на R.RESULT = 1? – 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

Возможно, лучше использовать 'RANK', поскольку в случае галстука' ROW_NUMBER' будет выбирать один произвольно. –

+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';