按类别排名前 10 位 mysql

top 10 by category mysql

我有一个 table,我必须根据每个人在该类别中花费的金额在每个类别中获得前 10 名。我的示例数据是

person category amount
roger  perfume   20
jim    perfume   50
joe    tv        5
jim    tv        25
kathy  car       40
alicia perfume   100

我必须在一个查询中得到这个。我知道 limit 对 amount 不起作用,例如 limit amount 10。请帮助

使用变量:

SELECT person, category, amount
FROM (
  SELECT person, category, amount,
         @rn := IF(@cat = category, @rn+1,
                   IF(@cat := category, 1, 1)) AS rn
  FROM mytable
  CROSS JOIN (SELECT @rn := 0, @cat := '') AS vars
  ORDER BY category, amount DESC) AS t
WHERE t.rn <= 10

@rn 用于按 amount 降序枚举每个 category 切片中的行。

因此,外部查询 returns 每个 category 的 10 个排名最高的行。如果特定类别的记录少于 10 条,则返回所有这些记录。

Demo here

由于类别多次出现,您需要按类别分组,汇总金额。然后对其进行排序,保留你想要的行数。

我认为以下方法可行:

SELECT category, SUM(amount) as amount
FROM mytable
GROUP BY category
ORDER BY SUM(amount) DESC
LIMIT 10

试试这个

Select Top 10
      person, category, sum(amount) as Amount
      from Table
      group by person,category