按类别排名前 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 条,则返回所有这些记录。
由于类别多次出现,您需要按类别分组,汇总金额。然后对其进行排序,保留你想要的行数。
我认为以下方法可行:
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
我有一个 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 条,则返回所有这些记录。
由于类别多次出现,您需要按类别分组,汇总金额。然后对其进行排序,保留你想要的行数。
我认为以下方法可行:
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