返回行与一列的每个组的最大值[重复]返回行与一列的每个组的最大值[重复](Return row wi

2019-05-13 16:17发布

这个问题已经在这里有一个答案:

  • 取具有用于一列中的最大值的行 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;

这工作,但非常低效(我必须手动筛选出所有这些行,当我应该能够在第一时间抢不到那些行。)

我能做些什么,以获得正确的价值观?

Answer 1:

这也可以在没有子查询:

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;

否则这样做。



Answer 2:

您正在使用分析功能在正确的轨道上。 但你可能要像这样与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

如果有可能的关系(即具有相同的行idround您可能需要使用) 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


Answer 3:

对于这种问题,我倾向于使用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小提琴



文章来源: Return row with the max value of one column per group [duplicate]