Oracle动态获取过去一年数据:现有SQL查询的修改咨询
动态筛选过去一年记录并统计用户次数的SQL方案
嘿,这个需求很常见,我来帮你搞定!要实现动态获取过去一年数据且统计userID出现次数大于2的效果,完全不用硬编码日期,核心是利用数据库自带的日期函数来动态计算时间范围就行。
核心思路
先筛选出过去一年的有效记录,再对这些记录分组统计——这样比先全表分组再过滤效率高多了,尤其是数据量大的时候优势更明显。
针对不同数据库的实现
不同数据库的日期函数略有差异,我给你列几个常用版本:
1. MySQL/MariaDB版本
如果Timebooked是日期类型,直接用DATE_SUB计算一年前的日期:
SELECT userID, COUNT(userID) AS count FROM BookingTable WHERE Timebooked >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) GROUP BY userID HAVING COUNT(userID) > 2;
要是Timebooked是字符串类型(比如你例子里的10-May-2016格式),得先转成日期再比较:
SELECT userID, COUNT(userID) AS count FROM BookingTable WHERE STR_TO_DATE(Timebooked, '%d-%b-%Y') >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) GROUP BY userID HAVING COUNT(userID) > 2;
2. SQL Server版本
用DATEADD函数来计算一年前的日期:
SELECT userID, COUNT(userID) AS count FROM BookingTable WHERE Timebooked >= DATEADD(year, -1, GETDATE()) GROUP BY userID HAVING COUNT(userID) > 2;
3. Oracle版本
用SYSDATE搭配间隔值实现:
SELECT userID, COUNT(userID) AS count FROM BookingTable WHERE Timebooked >= SYSDATE - INTERVAL '1' YEAR GROUP BY userID HAVING COUNT(userID) > 2;
小提醒
- 一定要把日期筛选放在
WHERE子句里,而不是HAVING:先过滤掉旧数据再分组,能大幅减少分组时处理的数据量,提升查询速度。 - 如果你的数据库是其他类型(比如PostgreSQL),可以告诉我,我再给你适配对应的写法~
内容的提问来源于stack exchange,提问作者whalesboy
相关产品推荐
相关产品推荐

