【问题标题】:SQL Using Count() to find ids with frequencies other than MAXSQL 使用 Count() 查找频率不是 MAX 的 id
【发布时间】:2018-02-02 22:29:27
【问题描述】:

我有一个名为 book_author 的表,其架构 (book_id: int, author: string)。

我正在尝试获取作者数量第二多的书籍。

也就是说,如果表格是这样的:

book_id   |   author
_____________________
1         |   John
2         |   Anna
3         |   Dan
1         |   Robert
2         |   Kim
1         |   Oscar
3         |   Bill

回报将是这样的。 Book_id = 1 不在表中,因为它有最大值。

book_id    | NUM_AUTHORS
2          |  2
3          |  2

我最初的尝试如下,但这只是返回具有最大作者数的图书 ID,而不是第二大...我可以修改它吗?

SELECT book_id, COUNT(*) AS NUM_AUTHORS FROM book_author GROUP BY book_id 
HAVING COUNT(*) = 
(SELECT MAX(c) FROM
(SELECT COUNT(book_id) AS c
FROM book_author
GROUP BY book_id));

【问题讨论】:

  • 您只想要第二高的吗?第三或第四高呢?
  • @clinomaniac 只有第二个!
  • 如果有平局怎么办?
  • @GordonLinoff 如果多行排在第二位,都应该显示
  • @user7090180 - 如果第一名有平局?计数第二高的书将与计数最高的书具有相同的计数...

标签: mysql sql


【解决方案1】:

您可以通过按降序排列计数并获取第二行(带有偏移量和限制)来做到这一点

select book_id,count(*)
from book_author
group by book_id
having count(*) = (select distinct cnt
                   from (select count(*) as cnt
                         from book_author 
                         group by book_id 
                        ) t
                   order by cnt desc 
                   limit 1 offset 1
                  )

【讨论】:

  • 如果两个作者的最大计数相同怎么办?
  • 为了挑剔,您应该再次聚合子查询,或者在应用限制/偏移之前应用不同的查询。如果两位作者的书籍数量最多,那么这将返回拥有最多书籍的作者的书籍。因此,它不应该找到第二大流行作者的书籍数量,而是第二高频率得分。 (4, 4, 3, 3 => 3)
  • @MatBailie .. 根据您的建议编辑了处理平局的答案。
  • @VamsiPrabhala 快速问题 - 您提供的代码中孤立的“t”字符是什么?
  • @user7090180 .. 它是派生表的别名(每个 book_id 计算行数).. 它可以是任何东西。
猜你喜欢
  • 2016-04-17
  • 2012-12-26
  • 2011-12-11
  • 2020-10-07
  • 2014-05-26
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多