如何用Access SQL统计同地址±60天内的交易记录数?
实现同地址±60天范围内记录数统计的两种方法
嘿,这个需求很常见,咱们可以用两种靠谱的方式来实现,根据你的数据库类型和数据量,你可以选最适合的一种:
方法一:自连接(兼容性强)
思路是把Usage表和自身做连接,关联条件设置为相同地址,并且关联记录的TransactionDate落在当前记录日期的±60天范围内,最后分组统计数量。
SELECT u1.Address, u1.TransactionDate, COUNT(u2.TransactionDate) AS Within60DaysCount FROM Usage u1 LEFT JOIN Usage u2 ON u1.Address = u2.Address AND u2.TransactionDate BETWEEN DATEADD(day, -60, u1.TransactionDate) AND DATEADD(day, 60, u1.TransactionDate) GROUP BY u1.Address, u1.TransactionDate ORDER BY u1.Address, u1.TransactionDate;
细节说明:
- 因为
Address + TransactionDate是唯一组合,所以COUNT不会出现重复统计的问题 - 这里的统计会包含当前记录本身(结果至少为1),如果不想包含自己,可以在JOIN条件里加
AND u2.TransactionDate <> u1.TransactionDate,或者把COUNT(u2.TransactionDate)改成COUNT(u2.TransactionDate) - 1 - 不同数据库的日期函数写法有差异:比如MySQL用
DATE_ADD(u1.TransactionDate, INTERVAL -60 DAY),PostgreSQL用u1.TransactionDate - INTERVAL '60 days',记得根据你的数据库调整
方法二:窗口函数(性能更优)
如果你的数据库支持窗口函数(比如SQL Server、MySQL 8+、PostgreSQL等),这种方法会更高效,不需要分组,直接在每行计算同地址下符合日期范围的记录数。
SELECT Address, TransactionDate, COUNT(*) OVER ( PARTITION BY Address ORDER BY TransactionDate RANGE BETWEEN INTERVAL 60 DAY PRECEDING AND INTERVAL 60 DAY FOLLOWING ) AS Within60DaysCount FROM Usage ORDER BY Address, TransactionDate;
细节说明:
PARTITION BY Address表示按地址分组计算RANGE BETWEEN ...定义了日期的范围:当前记录日期往前60天到往后60天- 同样,如果不想包含当前记录,可以把
COUNT(*)改成COUNT(CASE WHEN TransactionDate <> CURRENT_ROW.TransactionDate THEN 1 END),部分数据库可能需要调整语法(比如用ROWS代替RANGE,或者明确指定日期比较)
内容的提问来源于stack exchange,提问作者Justin Roberts
相关产品推荐
相关产品推荐

