1. 查询结果

需要根据数据查询出漏斗各层各数量

有表数据:

  1. event_name evnet_date user_id
  2. $PageView 2021-12-25 2337204
  3. $PageView 2021-12-26 2337204
  4. $PageLeave 2021-12-28 2337204

先把查询结果给出:

漏斗按步骤返回结果 - 图1

使用的sql:

  1. select
  2. argMax(event_date_temp, level) as event_date,
  3. level,
  4. uniqCombined(user_id) as leven_num
  5. from
  6. (
  7. select
  8. maxIf(event_date, event_name = '$PageView') as event_date_temp,
  9. windowFunnel(7 * 86400)(event_time, event_name = '$PageView', event_name = '$PageLeave') as level,
  10. user_id
  11. from
  12. events2
  13. group by
  14. user_id, event_date with rollup
  15. having
  16. event_date_temp > '1970-01-01' and level > 0 and user_id != ''
  17. )
  18. group by
  19. level

2. sql解释

1. SQL1:

  1. select
  2. event_date as event_date_temp,
  3. windowFunnel(7 * 86400)(event_time,event_name = '$PageView',event_name = '$PageLeave') as level,
  4. user_id
  5. from
  6. events2
  7. group by
  8. user_id, event_date

漏斗按步骤返回结果 - 图2

数据先按照 user_id, event_date 分组,再进行漏斗分析。 level=1,是因为不存在分组后的数据满足漏斗两个步骤的条件; 而level=0,是因为该内部分组中没有满足漏斗步骤1的数据。

2. SQL2:

  1. select
  2. maxIf(event_date, event_name = '$PageView') as event_date_temp,
  3. windowFunnel(7 * 86400)(event_time,event_name = '$PageView',event_name = '$PageLeave') as level,
  4. user_id
  5. from
  6. events2
  7. group by
  8. user_id, event_date

漏斗按步骤返回结果 - 图3

没有漏斗数据分组中进行漏斗分析

3. SQL3:

  1. select
  2. maxIf(event_date, event_name = '$PageView') as event_date_temp,
  3. windowFunnel(7 * 86400)(event_time,event_name = '$PageView',event_name = '$PageLeave') as level,
  4. user_id
  5. from
  6. events2
  7. group by
  8. user_id, event_date with rollup

漏斗按步骤返回结果 - 图4

SQL3 的结果在 SQL2 的基础上都了两条,这是 with rollup 的功效,对结果进行分组并且进行逐层统计