Sqlite 如何在一行中包含所有最大值?
我对学习SQL非常陌生,如果我的问题不完全准确,我很抱歉 我试图用这个查询回答的问题是“每个国家最流行的音乐类型是什么?”我不得不使用一个子查询,它可以工作,但我发现对于表中的一些国家,不止一种类型具有最大值。我一直在思考如何编辑我的查询,以便在结果中显示具有最大值的所有类型。以下是我使用DB Browser for SQLite的代码:Sqlite 如何在一行中包含所有最大值?,sqlite,count,max,groupwise-maximum,Sqlite,Count,Max,Groupwise Maximum,我对学习SQL非常陌生,如果我的问题不完全准确,我很抱歉 我试图用这个查询回答的问题是“每个国家最流行的音乐类型是什么?”我不得不使用一个子查询,它可以工作,但我发现对于表中的一些国家,不止一种类型具有最大值。我一直在思考如何编辑我的查询,以便在结果中显示具有最大值的所有类型。以下是我使用DB Browser for SQLite的代码: SELECT BillingCountry AS Country , name AS Genre , MAX(genre_count) AS Purchase
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次(该国的最大购买量)。如何调整查询,使其既包含两个查询,又不包含行中的第一个查询?您可以使用
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
这将以单独的行返回领带。如果您希望每个国家/地区有一行,还可以使用
GROUP\u CONCAT()
:
什么是
选择版本()代码>表演?太好了。另一根棍子,没有棒棒糖。请看我添加的标签。@ysth我正在使用DB浏览器,用于SQLite版本3.12.1,Qt版本5.12.8 SQLite版本3.33。0@ysth这是正确的。我意识到我错误地使用了mysql,并且已经改变了这一点。
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