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');
相关推荐
Loo国昌2 小时前
【AI应用开发实战】04_混合检索器:BM25+向量+可靠度融合实战
人工智能·后端·python·自然语言处理
先做个垃圾出来………3 小时前
Flask框架特点对比
后端·python·flask
人道领域3 小时前
SpringBoot整合Junit与Mybatis实战
java·spring boot·后端
今天你TLE了吗3 小时前
JVM学习笔记:第四章——虚拟机栈
java·jvm·笔记·后端·学习
源码获取_wx:Fegn08953 小时前
计算机毕业设计|基于springboot + vue家政服务平台系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
南部余额3 小时前
Spring Boot ResponseEntity响应处理与文件下载实战
spring boot·后端·http
+VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue社区智慧消防管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
+VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue物业管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
上进小菜猪13 小时前
基于 YOLOv8 的水体污染目标检测系统 [目标检测完整源码]
后端