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

我对学习SQL非常陌生,如果我的问题不完全准确,我很抱歉

我试图用这个查询回答的问题是“每个国家最流行的音乐类型是什么?”我不得不使用一个子查询,它可以工作,但我发现对于表中的一些国家,不止一种类型具有最大值。我一直在思考如何编辑我的查询,以便在结果中显示具有最大值的所有类型。以下是我使用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次(该国的最大购买量)。如何调整查询,使其既包含两个查询,又不包含行中的第一个查询?

您可以使用
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