请求详解Albina编写的每日订阅者最后位置查询SQL语句
Albina的SQL查询执行逻辑详解
第一步:用CTE预处理位置数据
先创建一个临时结果集ranked_locations,给每条位置记录打上排序标签:
CAST(timestamp AS DATE) AS event_date:把记录的时间戳转成纯日期格式,目的是把同一用户同一天的位置记录归到一组。ROW_NUMBER() OVER (...) AS rn:这是关键的窗口函数,具体作用是:PARTITION BY subscriber_id, event_date:按「订阅者ID+日期」分组,每个用户每天的记录单独成一组,互不干扰。ORDER BY timestamp DESC:在每个组内部,按时间戳从晚到早排序,当天最后一次的位置记录会排在组里的第1位,对应的rn值就是1。
第二步:筛选出每天的最后位置
从预处理的临时结果集里,只挑rn = 1的记录:
- 因为每个「订阅者+日期」组里,
rn=1的那条就是该用户当天时间最晚的位置,正好是我们要找的“当日最后位置”。 - 最后输出订阅者ID、日期、对应的最后位置即可。
额外说明
如果同一天同一个用户有好几条时间戳完全相同的位置记录,ROW_NUMBER()会随机给这些记录分配1、2、3...的序号,最终只会保留一条。要是想保留所有同时间的最后位置,把ROW_NUMBER()换成RANK()就行——这样同时间的记录rn都会是1,结果里会包含这些重复项。
内容的提问来源于stack exchange,提问作者MIku
相关产品推荐
相关产品推荐

