【问题标题】:Find lowest number from column in table从表中的列中查找最小的数字
【发布时间】:2016-08-08 14:15:31
【问题描述】:

我有 3 张桌子 - EVENT、MEMBER、RANK。对于特定事件(例如 EVENT01),我需要显示最佳结果(来自 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;

【问题讨论】:

  • 不是每个赛事都有获胜者吗?为什么不能在 R.RESULT = 1 上简单地过滤(使用 WHERE 子句)?

标签: sql oracle


【解决方案1】:

首先,学会使用显式的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;

【讨论】:

  • 使用RANK 可能会更好,因为在平局的情况下,ROW_NUMBER 会任意选择一个。
  • @JeffreyKemp 。 . .如果您想在平局的情况下重复,请使用rank()dense_rank()
【解决方案2】:
 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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多