这个问题已经在这里有一个答案:
- 取具有用于一列中的最大值的行 34的答案
- 甲骨文的SQL查询:每基于时间组检索最新值[复制] 2个回答
- 获得每个组(在Oracle)顶部结果 5个回答
- GROUP BY与MAX(DATE)[重复] 6个答案
我有一个很难不为了抢最大行,然后抓住该行的值搜索同桌至少两次这样做。 有问题的表是相当大的,所以这是不可接受的。
这里是我的表可能是什么样子:
SCORES
ID ROUND SCORE
1 1 3
1 2 6
1 3 2
2 1 10
2 2 12
3 1 6
我需要返回每个ID在最近一轮拿到了分数。 也就是说,与MAX(轮)的行,但不是最高分。
OUTPUT:
ID ROUND SCORE
1 3 2
2 2 12
3 1 6
现在,我有:
SELECT * FROM
(SELECT id, round,
CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score
FROM
SCORES
where id in (1,2,3)
) scorevals
WHERE
scorevals.round is not null;
这工作,但非常低效(我必须手动筛选出所有这些行,当我应该能够在第一时间抢不到那些行。)
我能做些什么,以获得正确的价值观?
这也可以在没有子查询:
SELECT DISTINCT
id
,max(round) OVER (PARTITION BY id) AS round
,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM SCORES
WHERE id IN (1,2,3)
ORDER BY id;
返回你问什么了。
关键的一点是, DISTINCT
之后窗口功能应用。
SQL小提琴。
也许更快,因为它使用相同的窗口两次:
SELECT DISTINCT
id
,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round
,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM SCORES
WHERE id IN (1,2,3)
ORDER BY id;
否则这样做。
您正在使用分析功能在正确的轨道上。 但你可能要像这样与rank
功能
SELECT *
FROM (SELECT a.*,
rank() over (partition by id order by round desc) rnk
FROM scores
WHERE id IN (1,2,3))
WHERE rnk = 1
如果有可能的关系(即具有相同的行id
和round
您可能需要使用) row_number
解析函数,而不是rank
-这将随便挑两个并列排的一个有一个rnk
的1而不是返回既作为rank
会。
如果你想用MAX
解析函数,你也可以做类似
SELECT *
FROM (SELECT a.*,
MAX(round) OVER (partition by id) max_round
FROM scores
WHERE id IN (1,2,3))
WHERE round = max_round
对于这种问题,我倾向于使用max...keep...dense_rank
建设:
select
id,
max(round) round,
max(score) keep (dense_rank last order by round) score
from
tq84_scores
group by
id;
SQL小提琴