资讯动态

SQL如何分析连续购买行为特征_窗口函数在营销中的应用

发布时间:2026/9/29 16:43:05 来源:尧图企业网站定制
用LAG()获取用户前序订单日期再用DATE_DIFF()计算间隔天数筛选≤7天的记录即可识别业务定义的连续购买需统一时区、避免用ROW_NUMBER()替代时间分组。怎么用 LAG() 和 DATE_DIFF() 判断用户是否连续购买连续购买不是指“隔天买”而是指在业务定义的时间窗口内比如 7 天内有两次及以上购买。关键在于先算出每个用户相邻两次购买的间隔再筛选出满足条件的记录。常见错误是直接用 WHERE order_date DATE_SUB(prev_date, INTERVAL 1 DAY) —— 这只抓“严格隔天”漏掉大量真实连续行为比如周一买、周四又买中间没下单但仍在活跃周期内。用 LAG(order_date) 按 user_id 分组、按 order_date 排序取出上一笔订单日期用 DATE_DIFF(CURRENT_DATE(), prev_order_date, DAY)BigQuery或 DATEDIFF(day, prev_order_date, order_date)Trino/Spark算间隔天数注意时区所有 order_date 字段必须统一为业务时区比如 Asia/Shanghai否则跨日计算会错位为什么 ROW_NUMBER() 不能代替 RANK() 做连续会话分组营销场景里常要把用户多次购买打包成“一次连续行为”比如 7 天内三次下单算一个高意向会话。这时候要按时间切片分组而不是单纯排序。错误做法是给每笔订单打 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date)然后试图用序号差反推间隔——序号只反映顺序不携带时间信息一旦中间缺单序号差就失真。正确思路是用“前序订单时间 容忍窗口”作为锚点比如MAX(order_date) OVER (PARTITION BY user_id ORDER BY order_date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)更稳的做法是用递归或自连接生成会话 ID但性能差生产环境推荐用 ARRAY_AGG UNNEST 预聚合最近 N 笔订单再逐条判断MySQL 8.0 不支持 ARRAY_AGG得用变量模拟但并发下容易状态错乱GROUPS BETWEEN 窗口帧在连续行为统计中的实际限制想统计“每个用户最近 3 笔订单的平均金额”直觉会写 AVG(amount) OVER (PARTITION BY user_id ORDER BY order_date GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW)。但这个语法只有少数引擎支持Trino、DorisPostgreSQL 和 BigQuery 都不认。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑