如何在一行中包含所有最大值?
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
【讨论】:
以上是关于如何在一行中包含所有最大值?的主要内容,如果未能解决你的问题,请参考以下文章