以下解决方案应指导您朝着正确的方向前进。这些解决方案还保留了您为字段设置的任何索引的使用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
您希望从中检索总和的一年中的任何一周。