选择最低值并仅返回第一行

时间:2016-08-08 21:04:32

标签: sql oracle

我很难从以下查询返回第一行。我试图在RESULT列中返回一个特定EVENT的最低值,它工作正常,但它也返回其他行,我只想要一个。实现这一目标的最佳方法是什么?

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;

2 个答案:

答案 0 :(得分:1)

以下解决方案中的子查询是从原始帖子中复制并粘贴的,我没有测试它(显然因为我没有你的表),除了额外的字段:ROW_NUMBER()OVER ....而不是MIN(RESULT ...)

这使用指示的顺序(通知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;

这假设您只想返回一行,即使得分最低也是如此。如果存在关系,则选择哪一行是不确定的(至少使用此解决方案;您可以在ORDER BY中添加更多子句)。如果在关联的情况下您希望列出所有绑定成员,则可以使用DENSE_RANK()而不是ROW_NUMBER()

答案 1 :(得分:0)

因此,除了行result之外,您还要显示事件的最小值result。请使用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;