我很难从以下查询返回第一行。我试图在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;
答案 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;