关于子查询条件的Oracle SQL

时间:2017-05-18 09:23:42

标签: sql oracle match top-n

我使用子查询得到了关于Oracle SQL的问题。

使用如下所示的表格

enter image description here

问题是。

  

“编写一个查询,显示引用最大客户数量的客户。”

执行此代码时,您可以看到具有最大引用数的客户

SELECT cust_referred, COUNT(*) 
FROM customer
WHERE cust_referred IS NOT NULL
GROUP BY cust_referred;

我认为我需要将cust_num(上一个表)与cust_referred匹配,最大引用数为1003,其中包含3个。

2 个答案:

答案 0 :(得分:0)

如果我已正确理解您的问题,我认为这就是您正在寻找的

select cust_num, count(cust_refferred) from customer where cust_referred IS NOT NULL group by cust_num order by 2 desc

答案 1 :(得分:0)

cust_referred是进行推荐的客户。所以你想要的基本查询是

SELECT cust_referred
       , COUNT(*) as referrals
FROM customer
WHERE cust_referred IS NOT NULL
GROUP BY cust_referred
;

现在它成为一个前n个问题。

  

"如果有多个最大数字,我就不能选择一个。"

在Oracle 12c中有一个奇妙的FETCH子句,它使这很简单:

SELECT cust_referred
       , COUNT(*) as referrals
FROM customer
WHERE cust_referred IS NOT NULL
GROUP BY cust_referred
order by 2 desc
fetch first 1 rows with ties;

这(狡猾的英语语法,但合法的Oracle 12c)将返回引用次数最多的cust_refered,或者如果存在平局则返回所有引用。

在早期的Oracle版本中,有几种不同的实现,但它们都很笨拙。例如:

with cte as (  
    SELECT cust_referred
           , COUNT(*) as referrals
    FROM customer
    WHERE cust_referred IS NOT NULL
    GROUP BY cust_referred
)
select *
from cte
where cte.referrals = ( select max(referrals) from cte)
/