Oracle Sql获取对于另一列的每个不同值出现的值最多的值

时间:2015-11-20 01:56:45

标签: sql database oracle

所以我要说我有这张桌子

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

我希望languange出现在每个不同的优惠中,例如

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

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

3 个答案:

答案 0 :(得分:2)

这是使用common table expression s执行此操作的一种方法。

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

答案 1 :(得分:0)

您可以在oracle中使用row_number作为输出。

 SELECT LANGUAGE
        ,offer
    FROM (
        SELECT LANGUAGE
            ,offer
            ,row_number() OVER (
                PARTITION BY offer ORDER BY count(offer) DESC
                ) AS rno
        FROM table1
        GROUP BY LANGUAGE
            ,offer
        )
    WHERE rno = 1

答案 2 :(得分:0)

这是解决问题的标准方法:

select offer, language
from tablename t
group by offer, language
having not exists
(
  select 1
  from tablename
  where offer = t.offer
  group by language
  having count(language) > count(t.language)
)

在主查询中,您将每个商品的每种语言分组,并在子查询中检查同一商品中没有其他语言组包含更多商品。