sql - Oracle Sql获取另一列的每个不同值出现次数最多的值

标签 sql database oracle

假设我有这张 table

language | offer
chinese  |   1
chinese  |   1
english  |   1
spanish  |   2
spanish  |   2
italian  |   2
french   |   3

我想要每个不同报价出现次数最多的语言,就像这样

language | offer
chinese  |   1
spanish  |   2
french   |   3

我如何在 oracle sql 中执行此操作?

最佳答案

这是一种使用公共(public)表表达式的方法。

SQL Fiddle

在第一个 cte 中,您计算​​按报价和语言分组的计数。 在下一个 cte 中,使用 rankrow_number1 分配给具有最高语言计数的报价。 最后,从排名第一的行中选择。

with counts as(
select offer, language, count(*) cnt
from tablename
group by offer, language)
,ranking as
(select rank() over(partition by offer order by cnt desc) rnk
, c.*
from counts c)
select language, offer
from ranking 
where rnk = 1

没有窗口函数的替代方法:

with counts as (
select offer, language, count(*) cnt
from tablename
group by offer, language)
,maxcount as (select offer, max(cnt) mxcnt from counts group by offer)
select c.language, m.offer
from counts c
join maxcount m on m.offer = c.offer and m.mxcnt = c.cnt

关于sql - Oracle Sql获取另一列的每个不同值出现次数最多的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817716/

相关文章:

sql - 如何从 postgresql 中的查询返回 sql 数据类型?

database - 存储由行源查询生成的列表框值

database - 计算过载时的数据库性能

sql - 从 Rails 和 SQL 中的单个请求获取多个哈希

sql - 多列上的连接条件与连接列上的单连接?

oracle - 将 XML 从 Oracle 发布到 WebAPI

Oracle - 插入 x 数量的包含随机数据的行

mysql - 创建一个 "After Insert"触发器

mysql - SQL:获取每个主题的最后 3 个帖子

mysql - 如何在状态为 2 的 mysql 中使用 if 条件