繁体   English   中英

使用列的最大值从Oracle SQL表中过滤行

[英]Filter rows from oracle sql table using max value of a column

我正在学习oracle SQL,并且有一个如下表:

+--------+--------+------------------------+
| name   | nation | count                  |
+--------+--------+------------------------+
| Ruben  | UK     | 2                      |
| Ruben  | EEUU   | 16                     |
| Cesar  | UK     | 21                     |
| Cesar  | EEUU   | 12                     |
| Cesar  | FRANCE | 4                      |
| John   | FRANCE | 3                      |
| John   | UK     | 7                      |
| ....   | ..     | ..                     |
+--------+--------+------------------------+

上表代表我通过查询创建的内联视图。 如您所见,该表按名称和国家分组,并进行一些计数。 我想使用count列过滤表,使其具有以下内容:

+--------+--------+
| name   | nation |
+--------+--------+
| Ruben  | EEUU   |
| Cesar  | UK     |
| John   | UK     |
| ....   | ..     |
+--------+--------+  

如您所见,对于每个名称,我都希望根据计数选择国家。

您可以使用另一级别的内部查询来执行此操作。 就像是:

select name, nation
from (
  select name, nation, cnt,
    row_number() over (partition by name, nation order by cnt desc) as rn
  from (
    select name, nation, count(*) as cnt
    from <your table>
  )
)
where rn = 1;

row_number()分析将一个伪列添加到最里面的查询中,该查询将每个名称/国家/地区最高计数的行排名为1; 然后,最外面的查询只会查看排名第一的查询。

您需要决定如何处理关系-如果两个国家/名称行的计数相同,则可以使用rank()而不是row_number()来显示两者; 或者您可以通过在order by子句中添加另一列来决定选择哪一个。 目前,如果有两个相同的内容,它将只向您显示其中一个-而且显示的内容相当随意。

使用keep解析关键字:

select name, min(nation) keep (dense_rank last order by cnt)
from (select name, nation, count(*) as cnt
      from /* your data source */
      group by name, nation)
group by name
  1. min(nation) -在这种情况下,min是没有意义的,但是您必须保留它(如果没有,则无法使用)
  2. keep -仅keep nation一项结果
  3. dense_rank last说要拾取最后一个元素
  4. order by cnt表示如何定义元素的顺序

最终,它将为每个名字赢得最多国家的名声。 可以达到相同的结果

select name, min(nation) keep (dense_rank first order by cnt desc)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM