【问题标题】:New and Retained duplicates in BigqueryBigquery 中的新副本和保留副本
【发布时间】:2018-08-01 07:53:09
【问题描述】:

我正在使用 BigQuery 和 DataStudio 来显示整个几周的留存率,当用户是新用户然后在同一周再次使用该应用程序时,我遇到了问题,他既是新用户又在我的计算中保留了,我会喜欢这样他只是在使用该应用程序的第一周是新的,然后如果他在 2 周内再次使用该应用程序,他将被“保留”。

这是我的查询:

SELECT
UserID,
DATE,
DATE_DIFF(DATE,PreviousSessionDATE, DAY) as DaysBetweenSessions,
(SELECT
 CASE
WHEN DaysBetweenSessions <= 14 THEN 'Retained'
WHEN DaysBetweenSessions >14 THEN 'Returned'
WHEN DaysBetweenSessions IS NULL AND FirstSessionDATE = DATE THEN 'New'
WHEN DaysBetweenSessions IS NULL THEN 'User has an old version without Retention Parameters'
END) as User_Type
FROM
app_project.analytics_*********.events_*
GROUP BY
1,2,3,4
ORDER BY
DATE DESC,
DaysBetweenSessions DESC,
1,2,3,4

那么结果通常会很好,除非用户多次使用该应用并获得 1-14 之间的 DaysBetweenSessions,然后在同一周内同时计为新的和保留的。

然后在 DataStudio 中,我将执行 YEARWEEK(DATE) 以每周可视化,并将 Count_Distinct(UserID) 作为我的指标。

关于我如何整理以便新用户仅在第一周被视为新用户的任何想法,即使该用户在该周内进行培训?

Current output in BQ:
UserID     DATE        DaysBetweenSessions     User_Type
123        20180801    NULL                    "New"
123        20180801    0                       "Retained"

以及想要的输出

UserID     DATE        DaysBetweenSessions     User_Type
123        20180801    NULL                    "New"

【问题讨论】:

  • 您是否仍然想要单独的行,两者都是“新”而不是“新”,“保留”,...或者您是否想要一个只有“新”的单行,保留第一个会话?当前和所需输出的示例将很有用。
  • @Bobbylank 因此,所需的输出是仅在 7 天内将新用户计为新用户,与新用户、保留用户、返回用户在同一列中。示例:DATE:20180101 type:"New" id:"123",然后 DATE:20180102 type:"Retained" id:"123" 所需输出仅是第一行
  • 我为“第一周”方面进行了编辑,但不确定您是指新访问后的 7 天还是日历周。如果是日历周,则将“DaysBetween”部分更改为该周的开始日期
  • @Bobbylank 这解决了!谢谢!

标签: sql google-bigquery google-data-studio retention


【解决方案1】:

可能有一种更简洁的方法可以做到这一点,但是......

WITH CTE AS
(SELECT
UserID,
DATE,
DATE_DIFF(DATE,PreviousSessionDATE, DAY) as DaysBetweenSessions,
(SELECT
CASE
WHEN DaysBetweenSessions <= 14 THEN 'Retained'
WHEN DaysBetweenSessions >14 THEN 'Returned'
WHEN DaysBetweenSessions IS NULL AND FirstSessionDATE = DATE THEN 'New'
WHEN DaysBetweenSessions IS NULL THEN 'User has an old version without Retention 
Parameters'
END) as User_Type,
(SELECT
CASE
WHEN DaysBetweenSessions <= 7 THEN 0
WHEN DaysBetweenSessions >7 THEN 1
WHEN DaysBetweenSessions IS NULL AND FirstSessionDATE = DATE THEN 0
WHEN DaysBetweenSessions IS NULL THEN 2
END) as DaysBetween
FROM
app_project.analytics_*********.events_*
GROUP BY
1,2,3,4
ORDER BY
DATE DESC,
DaysBetweenSessions DESC,
1,2,3,4),

Result as 
(SELECT *, min(User_Type) OVER (PARTITION BY UserID, DaysBetween) minUser_Type
FROM CTE)

SELECT UserID,
DATE,
DaysBetweenSessions,
User_type 
FROM Result 
WHERE NOT (User_Type <> 'New' AND minUser_Type = 'New')

第二部分应该添加一个维度,该维度是该周字母顺序最低的 User_Type(因此,如果您将任何内容重命名为按字母顺序小于“New”,它将不起作用,最好使用数字)。

最后一部分应该去掉那一周有“新”但 User_Type 行不是“新”的那些。

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2012-05-31
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多