【问题标题】: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 标记并改变了它。

标签: sqlite count max groupwise-maximum


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2020-12-22
    • 2021-06-28
    相关资源
    最近更新 更多