SQL综合案例之电商漏斗转化分析,pv,uv及

news2024/11/28 21:59:59

 漏斗模型示例:

不同的业务场景有不同的业务路径 : 有先后顺序, 事件可以出现多次

注册转化漏斗 : 启动APP --> APP注册页面--->注册结果 -->提交订单-->支付成功

搜购转化漏斗 : 搜索商品--> 点击商品--->加入购物车-->提交订单-->支付成功

秒杀活动选购转化漏斗: 点击秒杀活动-->参加活动--->参与秒杀-->秒杀成功--->成功支付

 电商的购买转化漏斗模型图:

 

处理步骤 :

明确漏斗名称:购买转化漏斗

起始事件:浏览了商品的详情页

目标事件:支付

业务流程事件链路:详情页->购物车->下单页->支付

[事件之间有没有时间间隔要求 , 链路中相邻的两个事件是否可以有其他事件]

 

需求:求购买转化漏斗模型的转换率(事件和事件之间没有时间间隔要求,并且相邻两个事件可以去干其他的事)
1.每一个步骤的uv
2.相对的转换率(下一个步骤的uv/上一个步骤的UV),绝对的转换率(当前步骤的UV第一步骤的UV)

关心的事件:e1,e2,e4,e5  ==> 先后顺序不能乱

-- 准备数据
user_id  event_id   event_action  event_time
u001,e1,view_detail_page,2022-11-01 01:10:21
u001,e2,add_bag_page,2022-11-01 01:11:13
u001,e3,collect_goods_page,2022-11-01 02:07:11
u002,e3,collect_goods_page,2022-11-01 01:10:21
u002,e4,order_detail_page,2022-11-01 01:11:13
u002,e5,pay_detail_page,2022-11-01 02:07:11
u002,e6,click_adver_page,2022-11-01 13:07:23
u002,e7,home_page,2022-11-01 08:18:12
u002,e8,list_detail_page,2022-11-01 23:34:29
u002,e1,view_detail_page,2022-11-01 11:25:32
u002,e2,add_bag_page,2022-11-01 12:41:21
u002,e3,collect_goods_page,2022-11-01 16:21:15
u002,e4,order_detail_page,2022-11-01 21:41:12
u003,e5,pay_detail_page,2022-11-01 01:10:21
u003,e6,click_adver_page,2022-11-01 01:11:13
u003,e7,home_page,2022-11-01 02:07:11
u001,e4,order_detail_page,2022-11-01 13:07:23
u001,e5,pay_detail_page,2022-11-01 08:18:12
u001,e6,click_adver_page,2022-11-01 23:34:29
u001,e7,home_page,2022-11-01 11:25:32
u001,e8,list_detail_page,2022-11-01 12:41:21
u001,e1,view_detail_page,2022-11-01 16:21:15
u001,e2,add_bag_page,2022-11-01 21:41:12
u003,e8,list_detail_page,2022-11-01 13:07:23
u003,e1,view_detail_page,2022-11-01 08:18:12
u003,e2,add_bag_page,2022-11-01 23:34:29
u003,e3,collect_goods_page,2022-11-01 11:25:32
u003,e4,order_detail_page,2022-11-01 12:41:21
u003,e5,pay_detail_page,2022-11-01 16:21:15
u003,e6,click_adver_page,2022-11-01 21:41:12
u004,e7,home_page,2022-11-01 01:10:21
u004,e8,list_detail_page,2022-11-01 01:11:13
u004,e1,view_detail_page,2022-11-01 02:07:11
u004,e2,add_bag_page,2022-11-01 13:07:23
u004,e3,collect_goods_page,2022-11-01 08:18:12
u004,e4,order_detail_page,2022-11-01 23:34:29
u004,e5,pay_detail_page,2022-11-01 11:25:32
u004,e6,click_adver_page,2022-11-01 12:41:21
u004,e7,home_page,2022-11-01 16:21:15
u004,e8,list_detail_page,2022-11-01 21:41:12
u005,e1,view_detail_page,2022-11-01 01:10:21
u005,e2,add_bag_page,2022-11-01 01:11:13
u005,e3,collect_goods_page,2022-11-01 02:07:11
u005,e4,order_detail_page,2022-11-01 13:07:23
u005,e5,pay_detail_page,2022-11-01 08:18:12
u005,e6,click_adver_page,2022-11-01 23:34:29
u005,e7,home_page,2022-11-01 11:25:32
u005,e8,list_detail_page,2022-11-01 12:41:21
u005,e1,view_detail_page,2022-11-01 16:21:15
u005,e2,add_bag_page,2022-11-01 21:41:12
u005,e3,collect_goods_page,2022-11-01 01:10:21
u006,e4,order_detail_page,2022-11-01 01:11:13
u006,e5,pay_detail_page,2022-11-01 02:07:11
u006,e6,click_adver_page,2022-11-01 13:07:23
u006,e7,home_page,2022-11-01 08:18:12
u006,e8,list_detail_page,2022-11-01 23:34:29
u006,e1,view_detail_page,2022-11-01 11:25:32
u006,e2,add_bag_page,2022-11-01 12:41:21
u006,e3,collect_goods_page,2022-11-01 16:21:15
u006,e4,order_detail_page,2022-11-01 21:41:12
u006,e5,pay_detail_page,2022-11-01 23:10:21
u006,e6,click_adver_page,2022-11-01 01:11:13
u007,e7,home_page,2022-11-01 02:07:11
u007,e8,list_detail_page,2022-11-01 13:07:23
u007,e1,view_detail_page,2022-11-01 08:18:12
u007,e2,add_bag_page,2022-11-01 23:34:29
u007,e3,collect_goods_page,2022-11-01 11:25:32
u007,e4,order_detail_page,2022-11-01 12:41:21
u007,e5,pay_detail_page,2022-11-01 16:21:15
u007,e6,click_adver_page,2022-11-01 21:41:12
u007,e7,home_page,2022-11-01 01:10:21
u008,e8,list_detail_page,2022-11-01 01:11:13
u008,e1,view_detail_page,2022-11-01 02:07:11
u008,e2,add_bag_page,2022-11-01 13:07:23
u008,e3,collect_goods_page,2022-11-01 08:18:12
u008,e4,order_detail_page,2022-11-01 23:34:29
u008,e5,pay_detail_page,2022-11-01 11:25:32
u008,e6,click_adver_page,2022-11-01 12:41:21
u008,e7,home_page,2022-11-01 16:21:15
u008,e8,list_detail_page,2022-11-01 21:41:12
u008,e1,view_detail_page,2022-11-01 01:10:21
u009,e2,add_bag_page,2022-11-01 01:11:13
u009,e3,collect_goods_page,2022-11-01 02:07:11
u009,e4,order_detail_page,2022-11-01 13:07:23
u009,e5,pay_detail_page,2022-11-01 08:18:12
u009,e6,click_adver_page,2022-11-01 23:34:29
u009,e7,home_page,2022-11-01 11:25:32
u009,e8,list_detail_page,2022-11-01 12:41:21
u009,e1,view_detail_page,2022-11-01 16:21:15
u009,e2,add_bag_page,2022-11-01 21:41:12
u009,e3,collect_goods_page,2022-11-01 01:10:21
u010,e4,order_detail_page,2022-11-01 01:11:13
u010,e5,pay_detail_page,2022-11-01 02:07:11
u010,e6,click_adver_page,2022-11-01 13:07:23
u010,e7,home_page,2022-11-01 08:18:12
u010,e8,list_detail_page,2022-11-01 23:34:29
u010,e5,pay_detail_page,2022-11-01 11:25:32
u010,e6,click_adver_page,2022-11-01 12:41:21
u010,e7,home_page,2022-11-01 16:21:15
u010,e8,list_detail_page,2022-11-01 21:41:12


-- 创建表
drop table if exists event_info_log;
create table event_info_log
(
user_id varchar(20),
event_id varchar(20),
event_action varchar(20),
event_time datetime
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 1;

-- 通过本地文件的方式导入数据
curl \
 -u root: \
 -H "label:event_info_log" \
 -H "column_separator:," \
 -T /root/data/event_log.txt \
 http://linux01:8040/api/test/event_info_log/_stream_load

 逻辑分析:

1. 先将用户的事件序列,按照漏斗模型定义的条件进行过滤,留下满足条件的事件

2. 将同一个人的满足条件的事件ID收集到数组,按时间先后排序,拼接成字符串

3. 将拼接好的字符串,匹配漏斗模型抽象出来的正则表达式

方法一:

--1. 先将用户的事件序列,按照漏斗模型定义的条件进行过滤,留下满足条件的事件
--2. 将同一个人的满足条件的事件ID收集到数组,按时间先后排序,拼接成字符串
--3. 将拼接好的字符串,匹配漏斗模型抽象出来的正则表达式

1.筛选时间条件,确定每个人的事件序列
select 
user_id,
max(event_ll) as event_seq  
from 
(
select 
user_id,
group_concat(event_id)over(partition by user_id order by report_date) as event_ll
from 
(
  select 
  user_id,event_id,report_date
  from event_info_log
  where event_id in ('e1','e2','e4','e5')
  and to_date(report_date) = '2022-11-01'
  order by user_id,report_date
) as temp
) as temp2
group by user_id;

+---------+------------------------+
| user_id | event_ll               |
+---------+------------------------+
| u006    | e4, e5, e1, e2, e4, e5 |
| u007    | e1, e4, e5, e2         |
| u005    | e1, e2, e5, e4, e1, e2 |
| u004    | e1, e5, e2, e4         |
| u010    | e4, e5, e5             |
| u001    | e1, e2, e5, e4, e1, e2 |
| u003    | e5, e1, e4, e5, e2     |
| u002    | e4, e5, e1, e2, e4     |
| u008    | e1, e1, e5, e2, e4     |
| u009    | e2, e5, e4, e1, e2     |
+---------+------------------------+

2.确定匹配规则模型
select
   user_id,
   '购买转化漏斗' as funnel_name ,
   case
   -- 正则匹配,先触发过e1,在触发过e2,在触发过e4,在触发过e5
   when    event_seq  rlike('e1.*e2.*e4.*e5') then 4
   -- 正则匹配,先触发过e1,在触发过e2,在触发过e4
   when    event_seq  rlike('e1.*e2.*e4') then 3
   -- 正则匹配,先触发过e1,在触发过e2
   when    event_seq  rlike('e1.*e2') then 2
   -- 正则匹配,只触发过e1
   when    event_seq  rlike('e1') then 1
   else 0 end step
from 
(
 select 
user_id,
max(event_ll) as event_seq  
from 
(
select 
user_id,
group_concat(event_id)over(partition by user_id order by report_date) as event_ll
from 
(
  select 
  user_id,event_id,report_date
  from event_info_log
  where event_id in ('e1','e2','e4','e5')
  and to_date(report_date) = '2022-11-01'
  order by user_id,report_date
) as temp
) as temp2
group by user_id
) as tmp3;

+---------+--------------------+------+
| user_id | funnel_name        | step |
+---------+--------------------+------+
| u006    | 购买转化漏斗       |    4 |
| u007    | 购买转化漏斗       |    2 |
| u005    | 购买转化漏斗       |    3 |
| u004    | 购买转化漏斗       |    3 |
| u010    | 购买转化漏斗       |    0 |
| u001    | 购买转化漏斗       |    3 |
| u003    | 购买转化漏斗       |    2 |
| u002    | 购买转化漏斗       |    3 |
| u008    | 购买转化漏斗       |    3 |
| u009    | 购买转化漏斗       |    2 |
+---------+--------------------+------+

-- 最后计算转换率
select 
  funnel_name,
  sum(if(step >= 1 ,1,0)) as step1,
  sum(if(step >= 2 ,1,0)) as step2,
  sum(if(step >= 3 ,1,0)) as step3,
  sum(if(step >= 4 ,1,0)) as step4,
  round(sum(if(step >= 2 ,1,0))/sum(if(step >= 1 ,1,0)),2) as 'step1->step2_radio',
  round(sum(if(step >= 3 ,1,0))/sum(if(step >= 2 ,1,0)),2) as 'step2->step3_radio',
  round(sum(if(step >= 4 ,1,0))/sum(if(step >= 3 ,1,0)),2) as 'step3->step4_radio'
from 
(
     select
        '购买转化漏斗' as funnel_name ,
        case
        -- 正则匹配,先触发过e1,在触发过e2,在触发过e4,在触发过e5
        when    event_seq  regexp('e1.*e2.*e4.*e5') then 4
        -- 正则匹配,先触发过e1,在触发过e2,在触发过e4
        when    event_seq  regexp('e1.*e2.*.*e4') then 3
        -- 正则匹配,先触发过e1,在触发过e2
        when    event_seq  regexp('e1.*e2') then 2
        -- 正则匹配,只触发过e1
        when    event_seq  regexp('e1') then 1
        else 0 end step
     from 
     (
        select 
        user_id,
        max(event_seq) as event_seq 
        from 
        -- 因为在doris1.1版本中还不支持数组,所以拼接字符串的时候还没办法排序
        (
        select 
        user_id,
        -- 用开窗的方式进行排序,然后在有序的按照时间升序,将事件拼接
        group_concat(concat(report_date,'_',event_id),'|')over(partition by user_id order by report_date) as event_seq
        from event_info_log 
        where to_date(report_date) = '2022-11-01'
        and event_id in('e1','e4','e5','e2')
        ) as tmp 
        group by user_id
     ) as t1 
) as t2
group by funnel_name;

+--------------------+-------+-------+-------+-------+--------------------+--------------------+--------------------+
| funnel_name        | step1 | step2 | step3 | step4 | step1->step2_radio | step2->step3_radio | step3->step4_radio |
+--------------------+-------+-------+-------+-------+--------------------+--------------------+--------------------+
| 购买转化漏斗       |     9 |     9 |     6 |     1 |                  1 |               0.67 |               0.17 |
+--------------------+-------+-------+-------+-------+--------------------+--------------------+--------------------+

 方法二:

1.按照时间排序,将所有事件全部拿出来,拼成一个字符串

select
 user_id,max(sz)eventhing
 from(
 select
 user_id,group_concat(event_id)over(partition by user_id order by event_time asc)sz
 from
 event_info_log
 )t1
 group by user_id;
 
 +---------+--------------------------------------------+
| user_id | eventhing                                  |
+---------+--------------------------------------------+
| u006    | e6, e4, e5, e7, e1, e2, e6, e3, e4, e5, e8 |
| u007    | e7, e7, e1, e3, e4, e8, e5, e6, e2         |
| u005    | e1, e3, e2, e3, e5, e7, e8, e4, e1, e2, e6 |
| u004    | e7, e8, e1, e3, e5, e6, e2, e7, e8, e4     |
| u010    | e4, e5, e7, e5, e6, e6, e7, e8, e8         |
| u001    | e1, e2, e3, e5, e7, e8, e4, e1, e2, e6     |
| u003    | e5, e6, e7, e1, e3, e4, e8, e5, e6, e2     |
| u002    | e3, e4, e5, e7, e1, e2, e6, e3, e4, e8     |
| u008    | e1, e8, e1, e3, e5, e6, e2, e7, e8, e4     |
| u009    | e3, e2, e3, e5, e7, e8, e4, e1, e2, e6     |
+---------+--------------------------------------------+
 
 
 2.
 -- 正则匹配
 select
 "电商的漏斗模型" as funnel_name,
 sum(if(step>=1,1,0))as step1_uv,
 sum(if(step>=2,1,0))as step2_uv,
 sum(if(step>=3,1,0))as step2_uv,
 sum(if(step>=4,1,0))as step2_uv
 
 from
 (
 select
  user_id,
  case 
		when eventhing rlike('e1.*e2.*e4.*e5') then 4
		when eventhing rlike('e1.*e2.*e4') then 3
		when eventhing rlike('e1.*e2') then 2
		when eventhing rlike('e1') then 1
		else 0 end as step
 from
 (
 select
 user_id,max(sz)eventhing
 from(
 select
 user_id,group_concat(event_id)over(partition by user_id order by event_time asc)sz
 from
 event_info_log
 )t1
 group by user_id
 )t2
 )t3

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scrum中可以有测试人员吗?

作者 | Federico Toledo Scrum 是将质量融入产品开发和创建敏捷团队的宝贵框架。测试人员如何适应这一切?让我们深入研究这篇文章。 毫无疑问,Scrum是在任何环境中为团队寻求业务敏捷性,以及应对不同复杂挑战的最重要工具之一。 正如《福布斯…

在pycharm里安装pytorch环境-GPU版

1、安装Anaconda 在官网下载安装:https://www.anaconda.com/download 2、安装pycharm https://www.jetbrains.com/pycharm/download/#sectionwindows 使用社区版即可。 3、检查conda环境 按winr,输入cmd回车打开命令窗 在命令窗内输入conda 环境无问…

小学课后兴趣班选课平台的设计与实现(ASP.NET,SQLServer)

系统功能模块设计 中小学课后兴趣班选课平台包括前台功能模块和后台功能模块:前台功能模块是给会员使用的功能模块,在前台功能模块中会员可以实现在线注册,登录,查看发布的新闻资讯信息,查看教师,在线留言&…

软件测试的 20 个误区

软件测试中常遇到的 20 个误区,争取能给想从事软件测试的小伙伴一点启发。 1、测试人员不需要了解软件开发知识 抛开自动化测试,测试开发等,这些是必须要学习软件开发知识。功能测试和接口测试等还是需要软件开发知识的,例如新建…

电动汽车、车载充电器及其过流保护电路介绍

摘要:本文通过比亚迪公司的专利了解电动汽车、车载充电器及其过流保护电路,其中,车载充电器包括AC/DC变换器和DC/DC变换器,AC/DC变换器和DC/DC变换器均采用光耦驱动的SiC开关管,过流保护电路包括:电流检测单…

ChatGPT与网络安全

文章目录 一、“AI用于攻击”二、“AI用于安全(防御)”三、“AI的防御”四、“AI被攻击” ChatGPT作为基于生成式预训练模型(GPT)的聊天机器人,其核心技术是自然语言处理(NLP)。随着NLP技术的不…

OS实战笔记(9)-- 构建二级引导器

Grub内核映像格式 Grub工作的时候,需要一个内核映像文件,其中包括了二级引导器模块、内核模块、图片和字库等。这些不同的文件都被放到了一个映像文件中,为了Grub能够正常加载,需要一个预先定义好的格式,以便Grub能解析…

代码实现 ResNet 详解

零、ResNet的介绍 ResNet代码(含详细的使用说明): https://github.com/GarsonWw/resnet-garson.git 当谈到深度学习中的卷积神经网络时,ResNet(Residual Network)是一个备受赞誉且引人注目的架构。ResNet…

最全的mysql编码集问题排查

用navicate导入一个json文件数据的时候,发现中文有一些是乱码的,查了很多资料,发现mysql、navicate编码集都没问题,包括导入流程,那是什么原因呢?想着难道是电脑的编码集影响了?于是调整以后&am…

【C语言】结构体——我就是秩序的创建者!(结构体数组、结构体指针、嵌套、匿名、字面量、伸缩型数组、链式结构)

一、结构体基础1.1 声明和定义1.1 初始化和赋值1.3 访问结构体成员 二、结构体数组2.1 定义和初始化2.2 访问 三、结构体的嵌套五、指向结构体的指针六、向函数传递结构体6.1 只传递结构体成员6.2 传递结构体指针6.3 传递结构体 七、结构体的其他特性——不容小觑7.1 结构体的大…

硬盘数据丢失怎么办?一招轻松恢复硬盘数据!

硬盘应该是最为常用的数据存储设备了,它为电脑等设备提供巨大的存储空间。我们在平时的工作和学习中也经常会使用硬盘来存储数据,很多用户会将多年搜集到的资料存到电脑硬盘里。 硬盘上的文件,不论是工作文档还是照片、视频,对用…

(四)ArcGIS空间数据的转换与处理——数据结构转换

ArcGIS空间数据的转换与处理——数据转换 空间数据的来源很多,如地图、工程图、规划图、航空与遥感影像等,因此空间数据也有多种格式。根据应用需要,需对数据进行格式转换,不同数据结构间的转换主要包括矢量数据到栅格数据的转换…

Guava的骚操作,大大提升了我摸鱼的时间

以面向对象思想处理字符串对基本类型进行支持总结 概述 1、Guava是google公司开发的一款Java类库扩展工具包,包括新的集合类型(如 multimap 和 multiset)、不可变集合、图形库,以及用于缓存、并发、I/O等实用程序。使用这些API一…

内存溢出导致的Full GC异常

背景 线上服务GC耗时过长,普遍10s,此外GC后,内存回收不多 问题一 通过查询gc日志可以发现,CMS进行垃圾回收的时候报concurrent mode failure错误,该错误是因为CMS进行垃圾回收的时候,新生代进行GC产生的对象…

JupyterLab(Jupyter Notebook)安装与使用

文章目录 前言安装JupyterLab切换中文语言JupyterLab desktop 使用演示其它补充后记 前言 目前在看《程序员数学:用Python学透线性代数和微积分》这个书,它里面的代码是在Jupyter中编写的,所以也安装下用用。 JupyterLab是一个可以同时编写…

[PyTorch][chapter 37][经典卷积神经网络-2 ]

1: VGG 2: GoogleNet 一 VGG 1.1 简介 VGGNet 是牛津大学计算机视觉组(Visual Geometry Group)和谷歌 DeepMind 一起研究出来的深度卷积神经网络,因而冠名为 VGG。VGG是一种被广泛使用的卷积神经网络结构,其在在20…

生成式模型的质量评估标准

Sample Quality Matrix 如何评价生成式模型的效果?ISFIDsFIDPrecision & RecallPrecisonRecall计算precision和recall 如何评价生成式模型的效果? Quality: 真实性(逼真,狗咬有四条腿) Diversity: 多样性&#x…

全网为数不多清晰可行的在VUE中使用sortable.js实现动态拖拽排序的教程!

目录 0 写在前面的 1 依赖安装 2 手写简单标签演示 3 要点 4 效果 0 写在前面的 首先批评以下文章 (10条消息) sortable.js 实现拖拽_sortablejs_花铛的博客-CSDN博客 (10条消息) sortablejs拖拽排序功能(vue)_C_fashionCat的博客-CSDN博客 他们…

Spring6入门 + Log4j2

1、环境要求 JDK:Java17(Spring6要求JDK最低版本是Java17) Maven:3.6 Spring:6.0.2 2、构建模块 (1)构建父模块spring6 在idea中,依次单击 File -> New -> Project ->…

什么是内部网络分段渗透测试?

网络攻击的规模、范围和复杂性与日俱增。随着黑客及其攻击方法变得越来越复杂,您的企业必须做出相应的响应,否则您的安全边界就会不堪重负。 如今,内部网络分段是将攻击成功风险降至最低、改善数据流和隔离关键支付数据的主要方法之一。 但是…