You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求指导:留存时间的R语言/SQL计算方法(附周分组SQL示例)

留存时间计算方案(SQL + R语言)

SQL实现

场景1:计算用户首次下单到后续订单的时间间隔

假设sales表包含user_id、order_date、quantity字段,以下SQL会计算每个用户后续订单与首次订单的间隔天数/周数:

WITH user_orders AS (
    SELECT 
        user_id,
        order_date,
        MIN(order_date) OVER (PARTITION BY user_id) AS first_order_date,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date) AS order_seq
    FROM sales
)
SELECT 
    user_id,
    order_date,
    first_order_date,
    DATEDIFF(day, first_order_date, order_date) AS retention_days,
    DATEDIFF(week, first_order_date, order_date) AS retention_weeks
FROM user_orders
WHERE order_seq > 1;

场景2:按周统计新用户留存率

如果需要统计每周新增用户在后续周的留存情况(比如第0周、第1周留存率),可以用以下代码:

WITH new_users AS (
    SELECT 
        user_id,
        DATEPART(week, MIN(order_date)) AS first_order_week
    FROM sales
    GROUP BY user_id
),
user_weekly_orders AS (
    SELECT 
        s.user_id,
        DATEPART(week, s.order_date) AS order_week
    FROM sales s
    GROUP BY s.user_id, DATEPART(week, s.order_date)
)
SELECT 
    nu.first_order_week AS signup_week,
    uwo.order_week AS retention_week,
    uwo.order_week - nu.first_order_week AS weeks_since_signup,
    COUNT(DISTINCT uwo.user_id) AS retained_users,
    (SELECT COUNT(DISTINCT user_id) FROM new_users WHERE first_order_week = nu.first_order_week) AS total_new_users,
    ROUND(COUNT(DISTINCT uwo.user_id) * 100.0 / (SELECT COUNT(DISTINCT user_id) FROM new_users WHERE first_order_week = nu.first_order_week), 2) AS retention_rate
FROM new_users nu
JOIN user_weekly_orders uwo ON nu.user_id = uwo.user_id
WHERE uwo.order_week >= nu.first_order_week
GROUP BY nu.first_order_week, uwo.order_week
ORDER BY nu.first_order_week, uwo.order_week;

R语言实现

假设已将sales数据导入为R数据框,包含user_id、order_date(需为日期类型)、quantity字段。

场景1:计算用户首次下单到后续订单的时间间隔

library(dplyr)
library(lubridate)

# 转换日期格式(若未转换)
sales$order_date <- ymd(sales$order_date)

user_retention <- sales %>%
  group_by(user_id) %>%
  mutate(
    first_order_date = min(order_date),
    order_seq = row_number(order_date),
    retention_days = as.numeric(order_date - first_order_date),
    retention_weeks = floor(retention_days / 7)
  ) %>%
  filter(order_seq > 1) %>%
  ungroup()

# 查看结果
head(user_retention)

场景2:按周统计新用户留存率

library(dplyr)
library(lubridate)

sales$order_date <- ymd(sales$order_date)
sales$order_week <- week(sales$order_date)

# 确定用户首次下单周
new_users <- sales %>%
  group_by(user_id) %>%
  summarise(first_order_week = min(order_week)) %>%
  ungroup()

# 去重用户每周下单记录
user_weekly_orders <- sales %>%
  distinct(user_id, order_week)

# 计算周留存率
weekly_retention <- new_users %>%
  inner_join(user_weekly_orders, by = "user_id") %>%
  filter(order_week >= first_order_week) %>%
  group_by(first_order_week, order_week) %>%
  summarise(retained_users = n_distinct(user_id)) %>%
  ungroup() %>%
  left_join(
    new_users %>%
      group_by(first_order_week) %>%
      summarise(total_new_users = n_distinct(user_id)),
    by = "first_order_week"
  ) %>%
  mutate(
    weeks_since_signup = order_week - first_order_week,
    retention_rate = round(retained_users / total_new_users * 100, 2)
  ) %>%
  arrange(first_order_week, order_week)

# 查看结果
print(weekly_retention)

内容的提问来源于stack exchange,提问作者Tasya Fauzia Fitriasari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:50:31