You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:26:34