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

如何用SQL统计近60天内同类型冰淇淋的重复记录数?

实现按冰淇淋类型统计指定日期前60天内的食用次数

需求回顾

现有记录孩子食用冰淇淋的表,包含type(冰淇淋类型)、Date(食用日期)两列,需新增一列统计每条记录对应日期往前60天内,同类型冰淇淋的食用次数。此前尝试的floor(连续天数差/60)方法因月份天数不一致,无法准确覆盖所有场景。


方法1:关联子查询(兼容性拉满)

几乎所有SQL数据库都支持这种写法,逻辑直白:对每条记录,单独查询同类型、日期落在当前记录日期前60天范围内的总条数。

SELECT
    t1.type,
    t1.Date,
    (SELECT COUNT(*)
     FROM ice_cream_consumption t2
     WHERE t2.type = t1.type
       AND t2.Date BETWEEN 日期偏移函数(t1.Date, -60) AND t1.Date) AS 近60天内的记录数
FROM ice_cream_consumption t1
ORDER BY t1.type, t1.Date DESC;

注意:日期偏移函数需根据你的数据库调整:

  • MySQL:DATE_SUB(t1.Date, INTERVAL 60 DAY)
  • PostgreSQL:t1.Date - INTERVAL '60 days'
  • SQL Server:DATEADD(day, -60, t1.Date)

方法2:范围窗口函数(高效推荐)

如果你的数据库支持范围窗口(如MySQL 8.0+、PostgreSQL、SQL Server),用窗口函数效率更高,无需重复子查询。核心是按type分组,针对日期列设置60天的范围窗口,统计窗口内的记录数。

以MySQL为例:

SELECT
    type,
    Date,
    COUNT(*) OVER (
        PARTITION BY type
        ORDER BY Date
        RANGE BETWEEN INTERVAL 60 DAY PRECEDING AND CURRENT ROW
    ) AS 近60天内的记录数
FROM ice_cream_consumption
ORDER BY type, Date DESC;

其他数据库语法微调:

  • PostgreSQL:把INTERVAL 60 DAY改为'60 days'
  • SQL Server:语法与示例一致

验证示例数据

拿香草冰淇淋的记录举例:

  • 11/15/2022往前60天是9/16/2022,包含10/24/2022和自身,计数为2
  • 08/20/2022往前60天内只有自身,计数为1
    完全匹配你给出的示例结果。

内容的提问来源于stack exchange,提问作者Roga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:42:49