无时间戳字段时如何编写查询统计指定时间范围的页面浏览量
核心结论
只靠当前数据库里存的PageViewCount累计字段,你永远算不出历史指定时间范围的页面浏览量。
这个字段存的是页面从上线到你查询时刻的所有访问累加总值,没有任何时间维度的标记,你不可能从一个孤零零的总数字里,拆出某30天的分段访问数据,不存在什么取巧的简便方法能回溯你没存过的数据。
零侵入实现方案
不用改你现有页面访问累加计数的逻辑,只要加一套非常轻量的快照机制就能解决问题,步骤如下:
- 建一张专门的浏览量快照表,只需要3个字段:
page_id(页面唯一ID)、snapshot_date(快照记录日期)、snapshot_view_count(当日记录的累计浏览量值) - 从你落地这套方案的当天开始,每天凌晨0点跑一个简单的定时任务,把所有页面当前的PageViewCount值全量写到这张快照表里,单次执行耗时基本可以忽略
- 等快照数据积累到你需要的时间跨度后,任意时间段的浏览量都可以靠差值算出来:比如要算最近30天的总浏览量,直接拿当前页面的PageViewCount值,减去30天前那天记录的snapshot_view_count值,得到的差值就是这30天的新增访问量。
对应统计逻辑的示例SQL如下:
-- 统计指定页面最近30天的浏览量 SELECT (p.PageViewCount - s.snapshot_view_count) AS last_30_days_views FROM page_main_table p INNER JOIN page_view_snapshot s ON p.page_id = s.page_id WHERE p.page_id = '你要查询的页面ID' AND s.snapshot_date = DATE_SUB(CURDATE(), INTERVAL 30 DAY);
注意事项
如果你之前从来没存过快照,现在想立刻拿到过去30天的浏览量是不可能的——你没记录过的数据没有任何方法能精准还原,从今天开始记第一份基准快照,等30天后你就能拿到第一份准确的周期统计数据,后续所有时间段的统计都可以靠这套机制长期支撑。
内容的提问来源于stack exchange,提问作者SQLNOVICE
相关产品推荐
相关产品推荐

