所以我要说我有这张桌子
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中执行此操作?
答案 0 :(得分:2)
这是使用common table expression
s执行此操作的一种方法。
在第一个cte中,您可以计算按要约和语言分组的计数。
在下一个cte中,使用rank
或row_number
将1
分配给具有最高语言计数的商品。
最后,从排名第一的行中选择。
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)
)
在主查询中,您将每个商品的每种语言分组,并在子查询中检查同一商品中没有其他语言组包含更多商品。