[英]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
min(nation)
-在这种情况下,min是没有意义的,但是您必须保留它(如果没有,则无法使用) keep
-仅keep
nation
一项结果 dense_rank last
说要拾取最后一个元素 order by cnt
表示如何定义元素的顺序 最终,它将为每个名字赢得最多国家的名声。 可以达到相同的结果
select name, min(nation) keep (dense_rank first order by cnt desc)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.