MySQL - 根据周/月数得到sum()

时间:2012-08-19 09:24:21

标签: mysql sql ruby-on-rails greatest-n-per-group

我有一个名为“transactions”的费用表,其中包括user_id,date_time和amount。

我要做的是查询基于周数/月的user_id分组的总和(金额),例如:

1)一周内排名前十的用户,比如22或10

2)排名前10位的用户,比如说,第3个月

我确实浏览了网站,虽然有类似的SQL示例,但它们主要基于7天的推拉窗口或“上周”或“上个月”。我仍然试图看看我是否可以使用MySQL文档解决它,但会欣赏任何可以节省一些时间的指针。

谢谢!

PS我正在使用Rails 3,也许框架有一些内置的方法呢?基本的发现者不会......

稍后编辑:

我原本预计这会有效,但它也包括本周的数据:

SELECT user_id,  sum(amount) AS t
 FROM transactions
 WHERE YEARWEEK(date_time) = YEARWEEK(now() - interval 1 week) 
group by user_id

1 个答案:

答案 0 :(得分:2)

以下解决方案应指导您朝着正确的方向前进。这些解决方案还会保留您为date_time字段设置的任何索引的使用(查询仍然可以查询,因为日期比较是在date_time列上进行的,而不是包含在date_time列中的-- Top 10 users by transaction amount for 3rd month of the year SELECT user_id, SUM(amount) AS t FROM transactions WHERE date_time >= STR_TO_DATE(CONCAT(YEAR(NOW()), '-03-01'), '%Y-%m-%d') AND date_time < STR_TO_DATE(CONCAT(YEAR(NOW()), '-03-01'), '%Y-%m-%d') + INTERVAL 1 MONTH GROUP BY user_id ORDER BY t DESC LIMIT 10 列功能):

03

^这里我们得到一年中第三个月(或三月)发生的用户交易总和。将-- Top 10 users by transaction amount for 20th week of the year SELECT user_id, SUM(amount) AS t FROM transactions WHERE date_time >= MAKEDATE(YEAR(NOW()), 7-(DAYOFWEEK(MAKEDATE(YEAR(NOW()), 7))-1)) + INTERVAL 20 WEEK AND date_time < MAKEDATE(YEAR(NOW()), 7-(DAYOFWEEK(MAKEDATE(YEAR(NOW()), 7))-1)) + INTERVAL 20 + 1 WEEK GROUP BY user_id ORDER BY t DESC LIMIT 10 的出现次数替换为您希望从中检索总和的一年中的任何一个月。


YEARWEEK()

^这个解决方案乍一看可能看起来很笨拙,但它正在做的是模仿date_time函数,以便将20列保持在任何类型之外函数换行(因此它可以利用前面提到的索引)。

将{{1}}的出现次数替换为您希望从中检索总和的一年中的任何一周。