从列中选择最小数字并显示其他列

时间:2016-08-06 21:38:59

标签: sql oracle

我需要找到我的RESULT列中的最小数字,我知道可以用MIN完成,但我不知道如何做到这一点以及选择我的其他列。我的代码显示了所有成员的所有结果,但我只是希望它显示最佳结果(最低数字)以及该成员的其他详细信息。

现在我有多个看起来像这样的条目:

EVENT_ID    EVENT_TYPE  EVENT_NAME  MEMBER_ID   MEMBER_FIRSTNAME    MEMBER_LASTNAME RESULT
event1      track       100M        0001        John                Smith           11.3

我只需选择结果最低的行并仅显示一行。到目前为止,这是我的代码:

SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, R.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, R.RESULT
FROM EVENT E, MEMBER M, RANK R
WHERE E.EVENT_ID = R.EVENT_ID
AND R.MEMBER_ID = M.MEMBER_ID;

SGEDDES - 我尝试使用您的上一种方法,但无法使其工作:

SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, R.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, R.RESULT
FROM (EVENT E, MEMBER M, RANK R
WHERE E.EVENT_ID = R.EVENT_ID
AND R.MEMBER_ID = M.MEMBER_ID;
ORDER BY RESULT)
WHERE ROWNUM = 1;

2 个答案:

答案 0 :(得分:1)

以下是使用row_number的一个选项(另请注意join语法 - 一般情况下,您不应在from子句中使用逗号):< / p>

SELECT * 
FROM (
    SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, 
         R.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, R.RESULT,
         row_number() over (order by R.RESULT) rn
    FROM EVENT E JOIN RANK R ON E.EVENT_ID = R.EVENT_ID
         JOIN MEMBER M ON R.MEMBER_ID = M.MEMBER_ID
) t
WHERE rn = 1

如果您需要按特定字段对结果进行分组,请使用partition by。例如:

row_number() over (partition by e.event_id order by result) rn

这是使用rownum的另一种选择:

SELECT *
  FROM (<<YOUR QUERY HERE>> ORDER BY R.Result )
 WHERE ROWNUM = 1;

答案 1 :(得分:0)

在最新版本的Oracle中,您可以使用fetch first 1 row only

SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, R.MEMBER_ID,
       M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, R.RESULT
FROM EVENT E JOIN
     RANK R
     ON E.EVENT_ID = R.EVENT_ID JOIN
     MEMBER M
     ON R.MEMBER_ID = M.MEMBER_ID
ORDER BY R.RESULT
FETCH FIRST 1 ROW ONLY;

如果您的Oracle版本较新,那么sgeddes的解决方案之一就可以了。