2015-11-20 13 views
4

因此,可以說,我有這個表的Oracle SQL越來越出現次數最多的爲另一列

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中執行此操作?

回答

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 
0

您可以使用ROW_NUMBER在Oracle爲輸出。

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 
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) 
) 

在主查詢,你組每提供每一種語言,並從同一個報價沒有其他語言組包含的子查詢檢查出現次數更多。