如何用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
相关产品推荐
相关产品推荐

