Spark SQL练习2-电商用户行为分析

背景

随着**商城电商平台业务的持续扩张,用户行为数据呈现出更加复杂和多样化的特征。在已完成基础购买行为分析的基础上,平台需要进一步挖掘用户行为背后的深层规律,包括用户活跃度变化趋势、商品关联购买模式、高价值用户识别以及流失风险预警等。这些深度分析将为精细化运营、个性化推荐和风险管控提供强有力的数据支撑。

题目

**商城电商平台需要基于历史用户行为数据,进行更深层次的用户行为洞察:

  1. 计算用户活跃度趋势指标
  2. 构建用户价值分层模型
  3. 分析用户流失风险特征

数据模型设计

用户信息表 (dim_users)

字段名 类型 说明
user_id BIGINT 用户唯一标识ID
user_name STRING 用户昵称
register_date DATE 用户注册日期
city STRING 用户常驻城市
membership_level STRING 会员等级:普通/白银/黄金/钻石
is_vip BOOLEAN 是否VIP用户

订单事实表 (fact_orders)

字段名 类型 说明
order_id BIGINT 订单唯一标识ID
user_id BIGINT 用户ID,关联dim_users表
order_date DATE 订单创建日期
order_time TIMESTAMP 订单创建时间戳
total_amount DOUBLE 订单实付金额
discount_amount DOUBLE 优惠折扣金额
status STRING 订单状态:paid/refunded/cancelled
payment_method STRING 支付方式:alipay/wechat/credit/card
channel STRING 下单渠道:app/web/miniprogram

订单明细表 (fact_order_items)

字段名 类型 说明
order_id BIGINT 订单ID,关联fact_orders表
product_id BIGINT 商品唯一标识ID
product_name STRING 商品名称
category STRING 商品一级类目
sub_category STRING 商品二级类目
quantity INT 购买数量
unit_price DOUBLE 商品单价
item_amount DOUBLE 商品小计金额

用户行为日志表 (fact_user_behavior)

字段名 类型 说明
user_id BIGINT 用户ID
behavior_date DATE 行为发生日期
behavior_time TIMESTAMP 行为发生时间戳
behavior_type STRING 行为类型:view/cart/favorite/buy
product_id BIGINT 商品ID
category STRING 商品一级类目
duration_seconds INT 停留时长(秒),仅view行为有值
device_type STRING 设备类型:mobile/pc/tablet
page_source STRING 来源页面:home/search/recommend/detail

统计需求

  1. 计算用户活跃度趋势指标(以2026-02-19为基准)
  • 统计最近30天内每个用户的活跃天数
  • 计算用户最近7天与之前23天的活跃天数比值(活跃度变化率)
  • 别活跃用户(最近7天活跃天数≥4天)、普通用户(最近7天活跃天数>=0 AND < 4)、沉默用户(最近7天无活跃但之前23天有活跃)、流失用户(最近30天无活跃)

查询结果按活跃天数降序排序,相等则按用户id升序

sql 复制代码
SELECT
    t.user_id                       AS user_id
  , u.user_name                     AS user_name
  , COUNT(DISTINCT t.behavior_date) AS active_days
  , ROUND(COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                            t.behavior_date, NULL)) / COUNT(DISTINCT IF(
        t.behavior_date < DATE_SUB('2026-02-19', 7), t.behavior_date, NULL)) *
          100, 2)                   AS active_days_change_rate
  , CASE
        WHEN COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) >= 4 THEN '活跃用户'
        WHEN COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) BETWEEN 0 AND 3
            THEN '普通用户'
        WHEN COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) = 0 AND
             COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 7),
                               t.behavior_date, NULL)) > 0 THEN '沉默用户'
        WHEN COUNT(DISTINCT t.behavior_date) = 0 THEN '流失用户'
        END                         AS user_type
FROM
    dataspire_catalog.db_dev.fact_user_behavior t
    LEFT JOIN dataspire_catalog.db_dev.dim_users u
              ON t.user_id = u.user_id
WHERE
    1 = 1 AND t.behavior_date >= DATE_SUB('2026-02-19', 30)
GROUP BY
    t.user_id, u.user_name
ORDER BY
    active_days DESC, user_id
LIMIT 10
;

预期输出:


  1. 构建用户价值分层模型(以2026-02-19为基准)
  • 基于RFM模型计算每个用户的价值得分:
    • R(Recency):最近一次购买距离当前的天数,分值1-5分(越近分数越高)
      • 5分:天数最小的前 20% 用户(最近刚买过)
      • 4分:天数在 20%-40% 之间的用户
      • 3分:天数在 40%-60% 之间的用户
      • 2分:天数在 60%-80% 之间的用户
      • 1分:天数最大的后 20% 用户(很久没买了)
    • F(Frequency):购买频次,分值1-5分(越高分数越高)
      • 5分:频次最高的前 20% 用户
      • 4分:频次在 20%-40% 之间的用户
      • 3分:频次在 40%-60% 之间的用户
      • 2分:频次在 60%-80% 之间的用户
      • 1分:频次最低的后 20% 用户
    • M(Monetary):消费总金额,分值1-5分(越高分数越高)
      • 5分:金额最高的前 20% 用户
      • 4分:金额在 20%-40% 之间的用户
      • 3分:金额在 40%-60% 之间的用户
      • 2分:金额在 60%-80% 之间的用户
      • 1分:金额最低的后 20% 用户
    • 综合得分 = R * 0.3 + F * 0.3 + M * 0.4
    • 根据综合得分将用户分为:高价值用户(前20%)、潜力用户(20%-50%)、一般用户(50%-80%)、低价值用户(后20%)

查询结果按综合得分降序排序,相等则按用户id升序,分值保留两位小数

sql 复制代码
WITH tab AS
(
SELECT
    t.user_id                                 AS user_id
  , u.user_name                               AS user_name
  , DATEDIFF('2025-02-19', MAX(t.order_date)) AS date_diff
  , COUNT(DISTINCT t.order_id)                AS order_cnt
  , SUM(i.item_amount)                        AS item_amt
FROM
    dataspire_catalog.db_dev.fact_orders t
    LEFT JOIN dataspire_catalog.db_dev.fact_order_items i
              ON t.order_id = i.order_id
    LEFT JOIN dataspire_catalog.db_dev.dim_users u
              ON t.user_id = u.user_id
WHERE
    1 = 1 AND t.status = 'paid'
GROUP BY
    t.user_id, u.user_name
),
tab1 AS
(
SELECT
    tab.user_id   AS user_id
  , tab.user_name AS user_name
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) <= 0.2 THEN 5
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) BETWEEN 0.2 AND 0.4 THEN 4
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) BETWEEN 0.4 AND 0.6 THEN 3
        WHEN PERCENT_RANK() OVER (ORDER BY date_diff) BETWEEN 0.6 AND 0.8 THEN 2
        ELSE 1
        END       AS date_diff_rank
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) <= 0.2 THEN 5
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) BETWEEN 0.2 AND 0.4
            THEN 4
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) BETWEEN 0.4 AND 0.6
            THEN 3
        WHEN PERCENT_RANK() OVER (ORDER BY order_cnt DESC) BETWEEN 0.6 AND 0.8
            THEN 2
        ELSE 1
        END       AS order_cnt_rank
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) <= 0.2 THEN 5
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) BETWEEN 0.2 AND 0.4
            THEN 4
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) BETWEEN 0.4 AND 0.6
            THEN 3
        WHEN PERCENT_RANK() OVER (ORDER BY item_amt DESC) BETWEEN 0.6 AND 0.8
            THEN 2
        ELSE 1
        END       AS item_amt_rank
FROM
    tab
WHERE
    1 = 1
)
SELECT
    tab1.user_id                       AS user_id
  , tab1.user_name                     AS user_name
  , ROUND(tab1.date_diff_rank * 0.3 + tab1.order_cnt_rank * 0.3 +
          tab1.item_amt_rank * 0.4, 2) AS final_rank
  , CASE
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank * 0.4 DESC) <= 0.2
            THEN '高价值用户'
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank *
                                           0.4 DESC) BETWEEN 0.2 AND 0.5
            THEN '潜力用户'
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank *
                                           0.4 DESC) BETWEEN 0.5 AND 0.8
            THEN '一般用户'
        WHEN PERCENT_RANK() OVER (ORDER BY tab1.date_diff_rank * 0.3 +
                                           tab1.order_cnt_rank * 0.3 +
                                           tab1.item_amt_rank *
                                           0.4 DESC) BETWEEN 0.8 AND 1
            THEN '低价值用户'
        ELSE '低价值用户'
        END
FROM
    tab1
WHERE
    1 = 1
ORDER BY
    final_rank DESC, tab1.user_id
;

预期输出:


  1. 分析用户流失风险特征
  • 识别有流失风险的用户
    • 我们需要对比两个时间段:
      • 基准期:例如 31-60 天前(用来定义用户的"正常活跃度")。
      • 观察期:最近 30 天(用来定义用户的"当前活跃度")。
      • 筛选条件:
        • 在 fact_user_behavior 表中发生任意行为(behavior_type IN ('view', 'cart', 'favorite', 'buy'))的天数。
        • 条件:观察期活跃天数 < 基准期活跃天数 * 0.5且最近30天无购买行为
  • 分析流失风险用户的行为特征:
    • 平均浏览时长变化率: (基准期平均每日浏览时长 - 观察期平均每日浏览时长) / 基准期平均每日浏览时长。
    • 主要浏览品类:统计观察期内用户浏览次数最多的 category(一级类目)。

查询结果平均浏览时长变化率降序排序

sql 复制代码
WITH tab AS
(
SELECT
    t.user_id                        AS user_id -- 用户id
  , u.user_name                      AS user_name -- 用户名
  , t.category                       AS category -- 商品一级类目
  , IF(COUNT(DISTINCT IF(t.behavior_date >= DATE_SUB('2026-02-19', 30),
                         t.duration_seconds, NULL)) = 0, 0,
       SUM(IF(t.behavior_date >= DATE_SUB('2026-02-19', 30), t.duration_seconds,
              0)) / COUNT(DISTINCT
                          IF(t.behavior_date >= DATE_SUB('2026-02-19', 30),
                             t.duration_seconds,
                             NULL))) AS avg_dur_seconds_obs -- 观察期平均每日浏览时长
  , IF(COUNT(DISTINCT IF(t.behavior_date < DATE_SUB('2026-02-19', 30),
                         t.duration_seconds, NULL)) = 0, 0,
       SUM(IF(t.behavior_date < DATE_SUB('2026-02-19', 30), t.duration_seconds,
              0)) / COUNT(DISTINCT
                          IF(t.behavior_date < DATE_SUB('2026-02-19', 30),
                             t.duration_seconds,
                             NULL))) AS avg_dur_seconds_bench -- 基期期平均每日浏览时长
  , COUNT(1)                         AS view_cnt -- 浏览次数
FROM
    dataspire_catalog.db_dev.fact_user_behavior t
    LEFT JOIN dataspire_catalog.db_dev.dim_users u
              ON t.user_id = u.user_id
WHERE
    1 = 1 AND t.behavior_date >= DATE_SUB('2026-02-19', 60)
GROUP BY
    t.user_id, u.user_name, t.category
HAVING
    -- 观察期活跃天数 < 基准期活跃天数 * 0.5
    IF(COUNT(DISTINCT IF(
            t.behavior_type IN ('view', 'cart', 'favorite', 'buy') AND
            t.behavior_date >= DATE_SUB('2026-02-19', 30), t.behavior_date,
            NULL))
           < COUNT(DISTINCT IF(
                t.behavior_type IN ('view', 'cart', 'favorite', 'buy') AND
                t.behavior_date < DATE_SUB('2026-02-19', 30), t.behavior_date,
                NULL)) * 0.5, 1, 0) = 1
),
tab1 AS
(
SELECT
     tab.user_id                AS user_id -- 用户id
   , tab.user_name              AS user_name -- 用户名
   , tab.category               AS category -- 商品一级类目
   , ROW_NUMBER() OVER (PARTITION BY tab.user_id
        ORDER BY view_cnt DESC) AS order_rank -- 排序
   , tab.avg_dur_seconds_obs    AS avg_dur_seconds_obs -- 观察期平均每日浏览时长
   , tab.avg_dur_seconds_bench  AS avg_dur_seconds_bench -- 基期期平均每日浏览时长
FROM
    tab
WHERE
    1 = 1
)
SELECT
    tab1.user_id                               AS user_id -- 用户id
  , tab1.user_name                             AS user_name -- 用户名
  , tab1.category                              AS category -- 用户浏览次数最多的 category
  , ROUND((tab1.avg_dur_seconds_bench - tab1.avg_dur_seconds_obs) /
          tab1.avg_dur_seconds_bench * 100,
          2)                                   AS avg_dur_seconds_diff -- 平均浏览时长变化率
FROM
    tab1
        -- 过滤掉最近30天内有消费的用户
    INNER JOIN (SELECT DISTINCT
                    t.user_id AS user_id
                FROM
                    dataspire_catalog.db_dev.fact_orders t
                WHERE
                    1 = 1 AND t.order_date < DATE_SUB('2026-02-19', 30)) o
               ON tab1.user_id = o.user_id
WHERE
    -- 取浏览次数最多的一级类目
    1 = 1 AND tab1.order_rank = 1
ORDER BY
    avg_dur_seconds_diff DESC, user_id
LIMIT 10
;

预期输出:


DDL

sql 复制代码
DROP TABLE IF EXISTS dataspire_catalog.db_dev.fact_user_behavior PURGE;
CREATE TABLE IF NOT EXISTS dataspire_catalog.db_dev.fact_user_behavior
(
    user_id          STRING COMMENT '用户ID',
    behavior_date    STRING COMMENT '行为发生日期',
    behavior_time    STRING COMMENT '行为发生时间戳',
    behavior_type    STRING COMMENT '行为类型:view/cart/favorite/buy',
    product_id       STRING COMMENT '商品ID',
    category         STRING COMMENT '商品一级类目',
    duration_seconds STRING COMMENT '停留时长(秒),仅view行为有值',
    device_type      STRING COMMENT '设备类型:mobile/pc/tablet',
    page_source      STRING COMMENT '来源页面:home/search/recommend/detail'
)
USING iceberg
TBLPROPERTIES (
    'comment' = '用户行为日志表'
)
;

-- ==================== 插入用户行为数据 ====================
INSERT INTO dataspire_catalog.db_dev.fact_user_behavior VALUES
-- ========== 用户10001(活跃用户 - 最近30天有多次活跃)==========
(10001, '2026-02-18', '2026-02-18 10:30:00', 'view', 5001, '手机数码', 120, 'mobile', 'home'),
(10001, '2026-02-18', '2026-02-18 10:35:00', 'view', 5002, '手机数码', 85, 'mobile', 'search'),
(10001, '2026-02-18', '2026-02-18 10:40:00', 'cart', 5001, '手机数码', 0, 'mobile', 'detail'),
(10001, '2026-02-18', '2026-02-18 10:45:00', 'buy', 5001, '手机数码', 0, 'mobile', 'detail'),
(10001, '2026-02-17', '2026-02-17 14:20:00', 'view', 5004, '电脑办公', 200, 'mobile', 'recommend'),
(10001, '2026-02-17', '2026-02-17 14:25:00', 'favorite', 5004, '电脑办公', 0, 'mobile', 'detail'),
(10001, '2026-02-16', '2026-02-16 09:15:00', 'view', 5005, '电脑办公', 150, 'web', 'home'),
(10001, '2026-02-16', '2026-02-16 09:20:00', 'cart', 5005, '电脑办公', 0, 'web', 'detail'),
(10001, '2026-02-15', '2026-02-15 16:00:00', 'view', 5006, '电脑办公', 180, 'mobile', 'search'),
(10001, '2026-02-15', '2026-02-15 16:10:00', 'buy', 5006, '电脑办公', 0, 'mobile', 'detail'),
(10001, '2026-02-14', '2026-02-14 11:30:00', 'view', 5016, '家用电器', 90, 'mobile', 'recommend'),
(10001, '2026-02-13', '2026-02-13 10:00:00', 'view', 5017, '家用电器', 110, 'mobile', 'home'),
(10001, '2026-02-13', '2026-02-13 10:05:00', 'cart', 5017, '家用电器', 0, 'mobile', 'detail'),
(10001, '2026-02-12', '2026-02-12 15:30:00', 'view', 5025, '美妆个护', 75, 'mobile', 'search'),
(10001, '2026-02-10', '2026-02-10 09:00:00', 'view', 5010, '服饰鞋包', 95, 'web', 'home'),
(10001, '2026-02-08', '2026-02-08 14:00:00', 'view', 5012, '智能穿戴', 130, 'mobile', 'recommend'),
(10001, '2026-02-08', '2026-02-08 14:10:00', 'buy', 5012, '智能穿戴', 0, 'mobile', 'detail'),
(10001, '2026-02-05', '2026-02-05 11:00:00', 'view', 5020, '手机数码', 160, 'mobile', 'search'),
(10001, '2026-02-01', '2026-02-01 10:30:00', 'view', 5001, '手机数码', 100, 'mobile', 'home'),
(10001, '2026-02-01', '2026-02-01 10:35:00', 'favorite', 5001, '手机数码', 0, 'mobile', 'detail'),
(10001, '2026-01-28', '2026-01-28 16:00:00', 'view', 5018, '家用电器', 140, 'mobile', 'recommend'),
(10001, '2026-01-25', '2026-01-25 09:30:00', 'view', 5003, '手机数码', 80, 'web', 'search'),
(10001, '2026-01-25', '2026-01-25 09:35:00', 'buy', 5003, '手机数码', 0, 'web', 'detail'),
(10001, '2026-01-20', '2026-01-20 14:00:00', 'view', 5019, '服饰鞋包', 105, 'mobile', 'home'),
(10001, '2026-01-15', '2026-01-15 11:00:00', 'view', 5007, '电脑办公', 175, 'mobile', 'recommend'),
(10001, '2026-01-15', '2026-01-15 11:10:00', 'cart', 5007, '电脑办公', 0, 'mobile', 'detail'),
(10001, '2026-01-15', '2026-01-15 11:15:00', 'buy', 5007, '电脑办公', 0, 'mobile', 'detail'),
-- ========== 用户10002(高价值用户 - 购买金额高)==========
(10002, '2026-02-19', '2026-02-19 10:00:00', 'view', 5009, '家用电器', 250, 'mobile', 'home'),
(10002, '2026-02-19', '2026-02-19 10:10:00', 'cart', 5009, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-19', '2026-02-19 10:15:00', 'buy', 5009, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-17', '2026-02-17 11:00:00', 'view', 5022, '电脑办公', 300, 'web', 'search'),
(10002, '2026-02-17', '2026-02-17 11:15:00', 'favorite', 5022, '电脑办公', 0, 'web', 'detail'),
(10002, '2026-02-16', '2026-02-16 14:30:00', 'view', 5020, '手机数码', 220, 'mobile', 'recommend'),
(10002, '2026-02-16', '2026-02-16 14:40:00', 'buy', 5020, '手机数码', 0, 'mobile', 'detail'),
(10002, '2026-02-14', '2026-02-14 09:00:00', 'view', 5024, '家用电器', 280, 'mobile', 'home'),
(10002, '2026-02-14', '2026-02-14 09:20:00', 'cart', 5024, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-14', '2026-02-14 09:30:00', 'buy', 5024, '家用电器', 0, 'mobile', 'detail'),
(10002, '2026-02-10', '2026-02-10 15:00:00', 'view', 5021, '手机数码', 190, 'mobile', 'search'),
(10002, '2026-02-10', '2026-02-10 15:10:00', 'buy', 5021, '手机数码', 0, 'mobile', 'detail'),
(10002, '2026-02-05', '2026-02-05 10:30:00', 'view', 5006, '电脑办公', 260, 'web', 'recommend'),
(10002, '2026-02-05', '2026-02-05 10:45:00', 'buy', 5006, '电脑办公', 0, 'web', 'detail'),
(10002, '2026-02-01', '2026-02-01 11:00:00', 'view', 5008, '家居生活', 240, 'mobile', 'home'),
(10002, '2026-02-01', '2026-02-01 11:15:00', 'cart', 5008, '家居生活', 0, 'mobile', 'detail'),
(10002, '2026-02-01', '2026-02-01 11:20:00', 'buy', 5008, '家居生活', 0, 'mobile', 'detail'),
(10002, '2026-01-28', '2026-01-28 14:00:00', 'view', 5023, '手机数码', 210, 'mobile', 'search'),
(10002, '2026-01-28', '2026-01-28 14:15:00', 'buy', 5023, '手机数码', 0, 'mobile', 'detail'),
(10002, '2026-01-20', '2026-01-20 09:30:00', 'view', 5017, '家用电器', 185, 'mobile', 'recommend'),
(10002, '2026-01-20', '2026-01-20 09:40:00', 'buy', 5017, '家用电器', 0, 'mobile', 'detail'),
-- ========== 用户10003(流失风险用户 - 最近30天活跃度下降)==========
(10003, '2026-01-15', '2026-01-15 08:00:00', 'view', 5010, '服饰鞋包', 90, 'web', 'home'),
(10003, '2026-01-15', '2026-01-15 08:10:00', 'cart', 5010, '服饰鞋包', 0, 'web', 'detail'),
(10003, '2026-01-10', '2026-01-10 19:30:00', 'view', 5011, '服饰鞋包', 75, 'mobile', 'search'),
(10003, '2026-01-10', '2026-01-10 19:35:00', 'favorite', 5011, '服饰鞋包', 0, 'mobile', 'detail'),
(10003, '2026-01-05', '2026-01-05 10:00:00', 'view', 5014, '手机数码', 100, 'web', 'recommend'),
(10003, '2026-01-05', '2026-01-05 10:05:00', 'cart', 5014, '手机数码', 0, 'web', 'detail'),
(10003, '2025-12-28', '2025-12-28 14:00:00', 'view', 5015, '手机数码', 85, 'mobile', 'home'),
(10003, '2025-12-28', '2025-12-28 14:05:00', 'buy', 5015, '手机数码', 0, 'mobile', 'detail'),
(10003, '2025-12-20', '2025-12-20 11:30:00', 'view', 5019, '服饰鞋包', 110, 'web', 'search'),
(10003, '2025-12-20', '2025-12-20 11:40:00', 'buy', 5019, '服饰鞋包', 0, 'web', 'detail'),
(10003, '2025-12-15', '2025-12-15 09:00:00', 'view', 5010, '服饰鞋包', 95, 'mobile', 'home'),
(10003, '2025-12-15', '2025-12-15 09:10:00', 'cart', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10003, '2025-12-15', '2025-12-15 09:15:00', 'buy', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10003, '2025-12-10', '2025-12-10 16:00:00', 'view', 5025, '美妆个护', 70, 'mobile', 'recommend'),
(10003, '2025-12-10', '2025-12-10 16:05:00', 'favorite', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10003, '2025-12-05', '2025-12-05 10:30:00', 'view', 5012, '智能穿戴', 120, 'web', 'search'),
(10003, '2025-12-05', '2025-12-05 10:40:00', 'buy', 5012, '智能穿戴', 0, 'web', 'detail'),
-- ========== 用户10004(新活跃用户 - 最近刚注册活跃)==========
(10004, '2026-02-19', '2026-02-19 10:00:00', 'view', 5012, '智能穿戴', 150, 'mobile', 'home'),
(10004, '2026-02-19', '2026-02-19 10:05:00', 'cart', 5012, '智能穿戴', 0, 'mobile', 'detail'),
(10004, '2026-02-19', '2026-02-19 10:10:00', 'buy', 5012, '智能穿戴', 0, 'mobile', 'detail'),
(10004, '2026-02-18', '2026-02-18 15:00:00', 'view', 5013, '智能穿戴', 130, 'mobile', 'search'),
(10004, '2026-02-18', '2026-02-18 15:05:00', 'buy', 5013, '智能穿戴', 0, 'mobile', 'detail'),
(10004, '2026-02-17', '2026-02-17 12:00:00', 'view', 5014, '手机数码', 110, 'web', 'recommend'),
(10004, '2026-02-17', '2026-02-17 12:05:00', 'cart', 5014, '手机数码', 0, 'web', 'detail'),
(10004, '2026-02-17', '2026-02-17 12:10:00', 'buy', 5014, '手机数码', 0, 'web', 'detail'),
(10004, '2026-02-16', '2026-02-16 18:00:00', 'view', 5015, '手机数码', 95, 'mobile', 'home'),
(10004, '2026-02-16', '2026-02-16 18:05:00', 'buy', 5015, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-15', '2026-02-15 09:00:00', 'view', 5001, '手机数码', 140, 'mobile', 'search'),
(10004, '2026-02-15', '2026-02-15 09:10:00', 'favorite', 5001, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-14', '2026-02-14 14:00:00', 'view', 5002, '手机数码', 100, 'mobile', 'recommend'),
(10004, '2026-02-14', '2026-02-14 14:05:00', 'cart', 5002, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-14', '2026-02-14 14:10:00', 'buy', 5002, '手机数码', 0, 'mobile', 'detail'),
(10004, '2026-02-10', '2026-02-10 11:00:00', 'view', 5025, '美妆个护', 80, 'mobile', 'home'),
(10004, '2026-02-10', '2026-02-10 11:05:00', 'buy', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10004, '2026-02-05', '2026-02-05 16:00:00', 'view', 5010, '服饰鞋包', 115, 'web', 'search'),
(10004, '2026-02-05', '2026-02-05 16:10:00', 'buy', 5010, '服饰鞋包', 0, 'web', 'detail'),
-- ========== 用户10005(稳定复购用户)==========
(10005, '2026-02-18', '2026-02-18 10:00:00', 'view', 5016, '家用电器', 180, 'mobile', 'home'),
(10005, '2026-02-18', '2026-02-18 10:10:00', 'cart', 5016, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-02-18', '2026-02-18 10:15:00', 'buy', 5016, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-02-15', '2026-02-15 14:00:00', 'view', 5017, '家用电器', 200, 'mobile', 'search'),
(10005, '2026-02-15', '2026-02-15 14:15:00', 'buy', 5017, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-02-10', '2026-02-10 16:00:00', 'view', 5018, '家用电器', 170, 'web', 'recommend'),
(10005, '2026-02-10', '2026-02-10 16:10:00', 'favorite', 5018, '家用电器', 0, 'web', 'detail'),
(10005, '2026-02-10', '2026-02-10 16:15:00', 'buy', 5018, '家用电器', 0, 'web', 'detail'),
(10005, '2026-02-05', '2026-02-05 11:00:00', 'view', 5009, '家用电器', 220, 'mobile', 'home'),
(10005, '2026-02-05', '2026-02-05 11:20:00', 'buy', 5009, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-01-28', '2026-01-28 10:00:00', 'view', 5024, '家用电器', 250, 'mobile', 'search'),
(10005, '2026-01-28', '2026-01-28 10:20:00', 'buy', 5024, '家用电器', 0, 'mobile', 'detail'),
(10005, '2026-01-20', '2026-01-20 14:00:00', 'view', 5006, '电脑办公', 190, 'mobile', 'recommend'),
(10005, '2026-01-20', '2026-01-20 14:15:00', 'cart', 5006, '电脑办公', 0, 'mobile', 'detail'),
(10005, '2026-01-20', '2026-01-20 14:20:00', 'buy', 5006, '电脑办公', 0, 'mobile', 'detail'),
(10005, '2026-01-15', '2026-01-15 09:00:00', 'view', 5020, '手机数码', 160, 'web', 'home'),
(10005, '2026-01-15', '2026-01-15 09:10:00', 'buy', 5020, '手机数码', 0, 'web', 'detail'),
(10005, '2026-01-08', '2026-01-08 10:00:00', 'view', 5021, '手机数码', 175, 'mobile', 'search'),
(10005, '2026-01-08', '2026-01-08 10:10:00', 'buy', 5021, '手机数码', 0, 'mobile', 'detail'),
-- ========== 用户10006(单次购买用户 - 低活跃)==========
(10006, '2026-01-10', '2026-01-10 11:00:00', 'view', 5019, '服饰鞋包', 120, 'mobile', 'home'),
(10006, '2026-01-10', '2026-01-10 11:05:00', 'cart', 5019, '服饰鞋包', 0, 'mobile', 'detail'),
(10006, '2026-01-10', '2026-01-10 11:10:00', 'buy', 5019, '服饰鞋包', 0, 'mobile', 'detail'),
(10006, '2026-01-05', '2026-01-05 14:00:00', 'view', 5010, '服饰鞋包', 90, 'mobile', 'search'),
(10006, '2026-01-05', '2026-01-05 14:05:00', 'favorite', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10006, '2025-12-28', '2025-12-28 10:00:00', 'view', 5011, '服饰鞋包', 85, 'web', 'recommend'),
(10006, '2025-12-28', '2025-12-28 10:05:00', 'cart', 5011, '服饰鞋包', 0, 'web', 'detail'),
-- ========== 用户10007(VIP高价值用户 - 高频高消费)==========
(10007, '2026-02-19', '2026-02-19 09:00:00', 'view', 5020, '手机数码', 280, 'mobile', 'home'),
(10007, '2026-02-19', '2026-02-19 09:15:00', 'cart', 5020, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-19', '2026-02-19 09:20:00', 'buy', 5020, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-18', '2026-02-18 10:30:00', 'view', 5021, '手机数码', 260, 'mobile', 'search'),
(10007, '2026-02-18', '2026-02-18 10:45:00', 'buy', 5021, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-17', '2026-02-17 11:30:00', 'view', 5022, '电脑办公', 300, 'web', 'recommend'),
(10007, '2026-02-17', '2026-02-17 11:50:00', 'buy', 5022, '电脑办公', 0, 'web', 'detail'),
(10007, '2026-02-16', '2026-02-16 15:00:00', 'view', 5023, '手机数码', 240, 'mobile', 'home'),
(10007, '2026-02-16', '2026-02-16 15:15:00', 'favorite', 5023, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-16', '2026-02-16 15:20:00', 'buy', 5023, '手机数码', 0, 'mobile', 'detail'),
(10007, '2026-02-15', '2026-02-15 10:00:00', 'view', 5024, '家用电器', 320, 'mobile', 'search'),
(10007, '2026-02-15', '2026-02-15 10:25:00', 'buy', 5024, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-02-12', '2026-02-12 14:00:00', 'view', 5006, '电脑办公', 270, 'web', 'recommend'),
(10007, '2026-02-12', '2026-02-12 14:20:00', 'buy', 5006, '电脑办公', 0, 'web', 'detail'),
(10007, '2026-02-08', '2026-02-08 09:00:00', 'view', 5009, '家用电器', 290, 'mobile', 'home'),
(10007, '2026-02-08', '2026-02-08 09:20:00', 'cart', 5009, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-02-08', '2026-02-08 09:25:00', 'buy', 5009, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-02-05', '2026-02-05 11:00:00', 'view', 5007, '电脑办公', 250, 'mobile', 'search'),
(10007, '2026-02-05', '2026-02-05 11:15:00', 'buy', 5007, '电脑办公', 0, 'mobile', 'detail'),
(10007, '2026-02-01', '2026-02-01 10:00:00', 'view', 5008, '家居生活', 230, 'web', 'recommend'),
(10007, '2026-02-01', '2026-02-01 10:15:00', 'buy', 5008, '家居生活', 0, 'web', 'detail'),
(10007, '2026-01-28', '2026-01-28 14:00:00', 'view', 5016, '家用电器', 210, 'mobile', 'home'),
(10007, '2026-01-28', '2026-01-28 14:15:00', 'buy', 5016, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-01-25', '2026-01-25 09:00:00', 'view', 5017, '家用电器', 200, 'mobile', 'search'),
(10007, '2026-01-25', '2026-01-25 09:15:00', 'buy', 5017, '家用电器', 0, 'mobile', 'detail'),
(10007, '2026-01-20', '2026-01-20 10:00:00', 'view', 5018, '家用电器', 220, 'web', 'recommend'),
(10007, '2026-01-20', '2026-01-20 10:20:00', 'buy', 5018, '家用电器', 0, 'web', 'detail'),
(10007, '2026-01-15', '2026-01-15 15:00:00', 'view', 5001, '手机数码', 190, 'mobile', 'home'),
(10007, '2026-01-15', '2026-01-15 15:10:00', 'buy', 5001, '手机数码', 0, 'mobile', 'detail'),
-- ========== 用户10008(新用户 - 数据最新)==========
(10008, '2026-02-19', '2026-02-19 14:00:00', 'view', 5025, '美妆个护', 140, 'mobile', 'home'),
(10008, '2026-02-19', '2026-02-19 14:05:00', 'cart', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10008, '2026-02-19', '2026-02-19 14:10:00', 'buy', 5025, '美妆个护', 0, 'mobile', 'detail'),
(10008, '2026-02-18', '2026-02-18 16:00:00', 'view', 5026, '美妆个护', 125, 'mobile', 'search'),
(10008, '2026-02-18', '2026-02-18 16:05:00', 'buy', 5026, '美妆个护', 0, 'mobile', 'detail'),
(10008, '2026-02-17', '2026-02-17 10:00:00', 'view', 5001, '手机数码', 160, 'mobile', 'recommend'),
(10008, '2026-02-17', '2026-02-17 10:10:00', 'favorite', 5001, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-16', '2026-02-16 11:00:00', 'view', 5002, '手机数码', 135, 'mobile', 'home'),
(10008, '2026-02-16', '2026-02-16 11:05:00', 'cart', 5002, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-16', '2026-02-16 11:10:00', 'buy', 5002, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-15', '2026-02-15 14:00:00', 'view', 5012, '智能穿戴', 150, 'web', 'search'),
(10008, '2026-02-15', '2026-02-15 14:10:00', 'buy', 5012, '智能穿戴', 0, 'web', 'detail'),
(10008, '2026-02-12', '2026-02-12 09:00:00', 'view', 5010, '服饰鞋包', 110, 'mobile', 'recommend'),
(10008, '2026-02-12', '2026-02-12 09:05:00', 'cart', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10008, '2026-02-12', '2026-02-12 09:10:00', 'buy', 5010, '服饰鞋包', 0, 'mobile', 'detail'),
(10008, '2026-02-08', '2026-02-08 15:00:00', 'view', 5014, '手机数码', 130, 'mobile', 'home'),
(10008, '2026-02-08', '2026-02-08 15:05:00', 'buy', 5014, '手机数码', 0, 'mobile', 'detail'),
(10008, '2026-02-05', '2026-02-05 10:00:00', 'view', 5015, '手机数码', 105, 'web', 'search'),
(10008, '2026-02-05', '2026-02-05 10:05:00', 'favorite', 5015, '手机数码', 0, 'web', 'detail'),
(10008, '2026-02-05', '2026-02-05 10:10:00', 'buy', 5015, '手机数码', 0, 'web', 'detail');
相关推荐
止语Lab1 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活1 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困1 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn1 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
用户298698530141 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户77283104908401 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金1 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
人间凡尔赛2 小时前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构
IT_陈寒2 小时前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端
卷无止境2 小时前
提升 Python 代码健壮性的方法大盘点
后端·python