如果不搜索同一个表至少两次以获取最大行,然后获取该行的值,我很难做到这一点。所讨论的表相当大,因此这是不可接受的。
我的桌子可能是这样的:
SCORES
ID ROUND SCORE
1 1 3
1 2 6
1 3 2
2 1 10
2 2 12
3 1 6
我需要返回每个ID在最近一轮中获得的分数。也就是说,具有最大(回合)的行,但不是最大得分的行。
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
被申请;被应用after窗口函数。
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;
否则做同样的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)