0

我有一张表格,我必须根据该类别中一个人的花费在每个类别中获得前 10 名。我的样本数据是

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

我必须在一个查询中得到这个。我知道 limit 不适用于像limit amount 10这样的金额。请帮忙

4

3 回答 3

1

使用变量:

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用于category按降序枚举每个切片中的行amount

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

演示在这里

于 2015-11-17T21:48:15.293 回答
-1

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

我认为以下将起作用:

SELECT category, SUM(amount) as amount
FROM mytable
GROUP BY category
ORDER BY SUM(amount) DESC
LIMIT 10
于 2015-11-17T21:49:44.973 回答
-1

尝试这个

Select Top 10
      person, category, sum(amount) as Amount
      from Table
      group by person,category
于 2015-11-17T22:37:27.867 回答