0

我有一个名为“交易”的费用表,其中包括用户 ID、日期时间和金额。

我要做的是根据周数/月查询按 user_id 分组的 sum(amount),例如:

1) 一周前 10 名的消费用户,比如 22 或 10

2) 例如,第 3 个月的前 10 名消费用户

我确实浏览了该站点,虽然有类似的 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
4

1 回答 1

3

以下解决方案应指导您朝着正确的方向前进。这些解决方案还保留了您为字段设置的任何索引的使用date_time(查询仍然是 sargable,因为日期比较是在裸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您希望从中检索总和的一年中的任何一周。

于 2012-08-19T13:08:07.167 回答