SQL查询:查找已分配最多专利数的公司名称

时间:2016-10-13 23:13:43

标签: sql oracle

Following is the schema of Database

使用此查询,我可以找到拥有最多专利的公司的公司受让人编号,但我似乎无法打印公司名称。

SELECT count(*), patent.assignee
FROM Patent
GROUP BY patent.assignee
HAVING count(*) =
    (SELECT max(count(*))
    FROM Patent
    Group by patent.assignee);

COUNT(*)--- ASSIGNEE

 9  19715
 9  27895

将查询嵌套到

SELECT company.compname
FROM company
WHERE ( company.assignee = ( *above query* ) );

会给出“太多值”的错误,因为有两家公司拥有最多的专利但是上面的查询在WHERE子句中只占用一个受让人编号。我该如何解决这个问题?我需要打印受让人编号为19715和27895的BOTH公司名称。谢谢。

3 个答案:

答案 0 :(得分:0)

在许多数据库中对另一个聚合函数(如.rst)应用聚合函数是非法的,但我相信使用max(count(*))运算符而一个联接来获取公司名称将解决您的问题。 / p>

试试这个:

ALL

答案 1 :(得分:0)

您已经开始使用嵌套查询的路径了。您需要做的就是删除COUNT(*)

SELECT company.compname
FROM company
WHERE company.assignee IN 
          (SELECT patent.assignee
           FROM Patent
           GROUP BY patent.assignee
           HAVING count(*) = (SELECT max(count(*))
                              FROM Patent
                              GROUP BY patent.assignee
                             )
          );

我不会这样写这个查询。 max(count(*))的使用特别棘手,但它是有效的Oracle语法。

答案 2 :(得分:0)

假设您有Oracle,我对此的看法有所不同:

select
    c.compname
from
    company c
join
    (
        select
            assignee,
            dense_rank() over (order by count(1) desc) rnk
        from
            patent
        group by
            assignee
    ) p
    on p.assignee = c.assignee
where
    p.rnk = 1
;

我喜欢这个因为是让你找到任何等级。例如,如果你想要前3,你只需要将p.rnk = 1更改为p.rnk< = 3.如果你想要第10位,你只需将它改为p.rnk = 10.添加总数和等级从这里进入结果也很容易。总的来说,我认为它更通用。