SQL 每个分类的前三个数据

新手上路,请多包涵

有一个用户表User(id, email),一个付费记录表Transaction (id, transaction_type, transaction_amount), 找出在每个付费类别里,付费总额最高的3个用户的email 和付费总额

阅读 4.7k
3 个回答

用这个两个关键字应该能帮你解决问题:desc limit3;

SELECT user.id, user.email, SUM(transaction.transaction_amount) as total_payment
FROM User user LEFT JOIN Transaction transaction ON user.ID = transaction.user_id
GROUP BY transaction.transaction_type
order by total_payment desc limit 0,3

思路,根据付费类别分组,计算每个付费类别下各用户的付费总额,按总额降序取前三

具体语句就不写了,说一下思路。
mysql高版本,支持窗口函数,像这样的:

row_number over (partition by transaction_type order by amount desc)

然后根据函数的返回值<=3,作为过滤条件

如果不支持的话,mysql有@变量,大概用法如下,需要sql中先按照transaction_type amount排序,判断transaction_type 和前一个是否相等,重置@rownum的值。最后按照下面语句中rank的值进行过滤。
用关键词“mysql row number”搜索,能找到完整的例子。

SELECT t.*, 
       @rownum := @rownum + 1 AS rank
  FROM YOUR_TABLE t, 
       (SELECT @rownum := 0) r
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题