如何在一行中包含所有最大值?

Posted

技术标签:

【中文标题】如何在一行中包含所有最大值?【英文标题】:How do I include all max values within a row? 【发布时间】:2021-05-08 02:57:18 【问题描述】:

我是学习 SQL 的新手,如果我的问题不完全准确,我深表歉意。

我试图用这个查询回答的问题是“每个国家/地区最受欢迎的音乐类型是什么?”我不得不使用子查询并且它有效,但我发现对于表中的几个国家/地区,不止一种类型具有 MAX 值。我不知道如何编辑我的查询,以便所有具有最大值的类型都显示在结果中。这是我的代码,使用 DB Browser for SQLite:

SELECT BillingCountry AS Country , name AS Genre , MAX(genre_count) AS Purchases
FROM (
    SELECT i.BillingCountry, g.name, COUNT(g.genreid) AS genre_count
FROM Invoice i
JOIN InvoiceLine il
ON il.InvoiceId = i.InvoiceId
JOIN TRACK t
ON il.trackid = t.TrackId
JOIN Genre g
ON t.genreid = g.GenreId
GROUP BY 1,2
) sub
GROUP BY 1

这是一个结果示例:

| Country | Genre |Purchase|
|---------|-------|--------|
|Agrentina|  Punk |   9    |
|Australia|  Rock |   22   |

但是在仅运行子查询来计算购买时,阿根廷有两个流派,购买次数为 9(该国家/地区的最大数量)。如何调整我的查询以包含这两个而不是只包含行中的第一个?

【问题讨论】:

select version(); 显示什么? 太棒了。另一根棍子,没有棒棒糖。 查看我添加的标签。 @ysth 我正在使用 SQLite 版本 3.12.1、Qt 版本 5.12.8 SQLite 版本 3.33.0 的数据库浏览器 @ysth 是正确的。我意识到我错误地用 mysql 标记并改变了它。 【参考方案1】:

你可以用RANK()窗口函数来做到这一点:

SELECT BillingCountry, name, genre_count
FROM (
  SELECT i.BillingCountry, g.name, COUNT(*) AS genre_count,
         RANK() OVER (PARTITION BY i.BillingCountry ORDER BY COUNT(*) DESC) rnk
  FROM Invoice i
  INNER JOIN InvoiceLine il ON il.InvoiceId = i.InvoiceId
  INNER JOIN TRACK t ON il.trackid = t.TrackId
  INNER JOIN Genre g ON t.genreid = g.GenreId
  GROUP BY i.BillingCountry, g.name
)
WHERE rnk = 1

这将在单独的行中返回平局。

如果您希望每个国家/地区有 1 行,您也可以使用 GROUP_CONCAT():

SELECT BillingCountry, GROUP_CONCAT(name) AS name, MAX(genre_count) AS genre_count
FROM (
  SELECT i.BillingCountry, g.name, COUNT(*) AS genre_count,
         RANK() OVER (PARTITION BY i.BillingCountry ORDER BY COUNT(*) DESC) rnk
  FROM Invoice i
  INNER JOIN InvoiceLine il ON il.InvoiceId = i.InvoiceId
  INNER JOIN TRACK t ON il.trackid = t.TrackId
  INNER JOIN Genre g ON t.genreid = g.GenreId
  GROUP BY i.BillingCountry, g.name
)
WHERE rnk = 1
GROUP BY BillingCountry

【讨论】:

以上是关于如何在一行中包含所有最大值?的主要内容,如果未能解决你的问题,请参考以下文章

DolphinDB:如何获取每个滑动组的最大值的第一行?

获取 SQL Server 中包含最大值的行

在 2D numpy 数组的每个滚动窗口中获取最大值

C语言 N为正整数,计算从1到N的所有整数中包含数字1的个数

Android:ListView在一行中包含所有值

根据列表中的数据框创建数据框,并在R中的列中包含最大值