SQL - 获取最大值

时间:2015-04-13 18:07:48

标签: sql postgresql join count aggregate-functions

以下查询为我提供了大于70的计数结果。

SELECT books.name, COUNT(library.staff)
FROM (library INNER JOIN books
ON library.staff = books.id)
GROUP BY library.staff,books.id
HAVING COUNT(library.staff) > 70;

如何修改查询以获得最大计数的结果?

4 个答案:

答案 0 :(得分:2)

一种方法是order bylimit

SELECT b.name, COUNT(l.staff) as cnt
FROM library l INNER JOIN
     books b
     ON l.staff = b.id
GROUP BY l.staff, b.name
ORDER BY cnt DESC
LIMIT 1;

我觉得很奇怪你是按两列分组,但只有一列在select。但是,如果查询正在运行,那么它只是在寻找重复项。

答案 1 :(得分:1)

你可以这样做

SELECT books.name, COUNT(library.staff)
FROM (library INNER JOIN books
ON library.staff = books.id)
GROUP BY library.staff,books.id
HAVING COUNT(library.staff) = (select max(library.staff) from library);

答案 2 :(得分:0)

您可以订购()DESC和LIMIT 1

SELECT books.name, COUNT(library.staff)
FROM (library INNER JOIN books
ON library.staff = books.id)
GROUP BY library.staff,books.id
ORDER BY COUNT(library.staff) DESC
LIMIT 1

答案 3 :(得分:0)

真的?

您加入library.staff = books.id。这是一个令人惊讶的命名惯例。书的ID等于"员工"图书馆?你应该提供表格定义和一些解释......

出于这个答案的目的,我们假设这是正确的。

审核查询

除了使用表别名以提高可读性之外,您还可以在以下几个地方进行简化:

SELECT b.id, b.name, count(*) AS ct
FROM   library l
JOIN   books b ON b.id = l.staff 
GROUP  BY b.id  -- l.staff -- redundant
HAVING count(*) > 70;
  • 由于您加入b.id = l.staffl.staff保证为NOT NULL,因此请使用count(*),这样做会更快一些(单独实现count,只计算行而不查看列。)

  • GROUP BY b.id在这种情况下没有l.staff的情况也一样。

  • 但由于您按b.id分组,而不是b.name分组,因此可能会有重复的名称,我们只能通过在结果中添加id来区分 - 除非{{ 1}}是唯一的,您没有指定。

查询速度更快

假设name是看似合理的主键:

books.id

阅读整个表格或大部分表格,首先聚合然后加入通常要快得多。

使用EXPLAIN ANALYZE进行测试。

答案

要获得具有最大数量的结果,SELECT b.id, b.name, l.ct FROM books b JOIN ( SELECT staff AS id, count(*) AS ct FROM library GROUP BY 1 ) l USING (id) HAVING count(*) > 70; 与提供的其他答案一样,通常是最快的选择 - 获取 一个获胜者

获取 所有获奖者

ORDER BY count(*) DESC LIMIT 1

在此使用window function rank()(不是SELECT b.id, b.name, l.ct FROM books b JOIN ( SELECT staff AS id, count(*) AS ct , rank() OVER (ORDER BY count(*) DESC) AS rnk FROM library GROUP BY 1 ) l USING (id) WHERE l.rnk = 1; ) 请注意,您可以将聚合函数和窗口函数组合在一个row_number()