我有一个名为“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
答案 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}}的出现次数替换为您希望从中检索总和的一年中的任何一周。