Oracle SQL - 分析功能超过一个组?

Jer*_*emy 11 sql oracle greatest-n-per-group

我的桌子:

ID   NUM   VAL
1    1     Hello
1    2     Goodbye
2    2     Hey
2    4     What's up?
3    5     See you
Run Code Online (Sandbox Code Playgroud)

如果我想返回每个ID的最大数量,它真的很干净:

SELECT MAX(NUM) FROM table GROUP BY (ID)
Run Code Online (Sandbox Code Playgroud)

但是,如果我想获取与每个ID的每个数字的最大值相关联的值,该怎么办?

为什么我不能这样做:

SELECT MAX(NUM) OVER (ORDER BY NUM) FROM table GROUP BY (ID) 
Run Code Online (Sandbox Code Playgroud)

为什么这是一个错误?我希望这个选择按ID分组,而不是为每个窗口单独分区...

编辑:错误是"不是GROUP BY表达式".

Wol*_*olf 15

你可以使用这个MAX() KEEP(DENSE_RANK LAST...)功能:

with sample_data as (
  select 1 id, 1 num, 'Hello' val from dual union all
  select 1 id, 2 num, 'Goodbye' val from dual union all
  select 2 id, 2 num, 'Hey' val from dual union all
  select 2 id, 4 num, 'What''s up?' val from dual union all
  select 3 id, 5 num, 'See you' val from dual)
select id, max(num), max(val) keep (dense_rank last order by num)
from sample_data
group by id;
Run Code Online (Sandbox Code Playgroud)

  • +1哇,这个答案很好。那不是知道窗口功能上是否有KEEP功能,或者它是Oracle专有的,尽管如此,这还是一个优雅的解决方案。通过http://stackoverflow.com/a/10359164 Oracle,此答案在大多数数据库上均有效:http://www.sqlfiddle.com/#!4/a9a07/19 Sql Server:http://www.sqlfiddle.com/ #!3 / a9a07 / 1 Postgresql:http://www.sqlfiddle.com/#!1 / a9a07 / 6 (2认同)