10.union all、N天连续登录

news2024/9/23 21:31:12

有日志如下,请写出代码求得所有用户和活跃用户的总数及平均年龄。(活跃用户指连续两天都有访问记录的用户)

数据准备
在这里插入图片描述
最后需完成的结果表
在这里插入图片描述
步骤1,所有用户的总数及平均年龄
(1). 将数据去重

with t1 as (
    select distinct
           user_id,
           age
    from test5
)

在这里插入图片描述
(2). 对用户总数以及平均年龄进行计算

t2 as (
select  count(user_id) as cnt,
        avg(age)       as avg_age
    from t1
)

在这里插入图片描述

步骤2 活跃用户的总数及平均年龄, 活跃用户指连续两天都有访问记录的用户【连续N天登录问题】

(1). 对表格进行全局的数据清洗

t3 as (
         select distinct dt,
                         user_id,
                         age
         from test5
     )

在这里插入图片描述
(2). 求连续活跃用户,先对每个用户进行标记。

标记方法:先将同一个用户分到一组,然后对dt进行排序,用dt减去序号。

注:一般求连续XXX的问题,基本都是用到row_number,rank等窗口函数增加标签列(伪列),然后用某列减去它们,如果是连续的,则减完后的结果是一致的,其他变相连续问题,也是该思考方式,主要是找到规律

t4 as (
         select dt,
                user_id,
                age,
                --同一个客户,按照不同日期排序,得到序号
                row_number() over (partition by user_id order by dt) as rn
         from t3
     ),
select * from t4

在这里插入图片描述
dt减去rn得到天数

  t5 as (
         select *,
                --用日期减去序号得到临时日期
                date_sub(dt,rn) as date2
         from t4
     ),
select * from t5

在这里插入图片描述
(3). 同一个用户data2的结果是相同的,那就可以表明是连续登录的。且连续的次数大于等于2即为连续活跃用户。

    t6 as (--统计date2临时日期出现几次。如果2次则表示连续登陆2次
         select user_id,
                date2,
                count(1) as cnt
         from t5
         group by user_id,date2
         having count(1)>=2
     ),
select * from t6

在这里插入图片描述
(4). 一个用户可能有多次连续登录的情况,所以对上述结果去重

   t7 as (
         select distinct user_id,age
         from t6
     ),
select * from t7

在这里插入图片描述
(5). 求活跃用户总数

    t8 as (
         select '活跃用户'         as type,
                count(user_id) as cnt,
                avg(age)       as avg_age
         from t7
     )
     
select * from t8;

在这里插入图片描述
完善t2代码,并将它t2t8合并,使用union all

   t2 as (
         select '所有用户' as type,
                count(user_id) as cnt,
                avg(age)       as avg_age
         from t1
     )

select * from t2 
union all
select * from t8;

在这里插入图片描述
完整代码


CREATE TABLE test5
(
    dt      string,
    user_id string,
    age     int
) ROW format delimited fields terminated BY ',';
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-11', 'test_1', 23);
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-11', 'test_2', 19);
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-11', 'test_3', 39);
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-11', 'test_1', 23);
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-11', 'test_3', 39);
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-11', 'test_1', 23);
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-12', 'test_2', 19);
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-13', 'test_1', 23);
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-15', 'test_2', 19);
INSERT INTO TABLE test_sql.test5
VALUES ('2019-02-16', 'test_2', 19);
--有日志如下,请写出代码求得所有用户和活跃用户的总数及平均年龄。(活跃用户指连续两天都有 访问记录的用户)
--步骤 1 所有用户的总数及平均年龄
with t1 as (
    select distinct
           user_id,
           age
    from test5
),
     t2 as (
         select '所有用户' as type,
                count(user_id) as cnt,
                avg(age)       as avg_age
         from t1
     ),
     --步骤 2 活跃用户的总数及平均年龄,活跃用户指连续两天都有 访问记录的用户)
     t3 as (
         select distinct dt,
                         user_id,
                         age
         from test5
     ),
     t4 as (
         select dt,
                user_id,
                age,
                --同一个客户,按照不同日期排序,得到序号
                row_number() over (partition by user_id order by dt) as rn
         from t3
     ),
     t5 as (
         select *,
                --用日期减去序号得到临时日期
                date_sub(dt,rn) as date2
         from t4
     ),
     t6 as (--统计date2临时日期出现几次。如果2次则表示连续登陆2次
         select user_id,
                date2,
                max(age) age,
                count(1) as cnt
         from t5
         group by user_id,date2
         having count(1)>=2
     ),
     t7 as (
         select distinct user_id,age
         from t6
     ),
     t8 as (
         select '活跃用户'         as type,
                count(user_id) as cnt,
                avg(age)       as avg_age
         from t7
     )
select * from t2 union all
select * from t8;

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

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

相关文章

如何使用交换机、路由器及防火墙进行组网以及他们之间的功能和区别

如何使用交换机、路由器及防火墙进行组网以及他们之间的功能和区别。 几乎大部分网络都有交换机、路由器和防火墙这三种基本设备,因此这三种设备对于网络而言非常重要,很多人对这三种设备的使用容易弄混。 一般网络部署: 或者抽象为这种部署模式: 几乎每个网络都有交换…

别再写jsp了,Thymeleaf它不香吗?

啥是 Thymeleaf在学 Thymeleaf 之前我们先看一下使用 jsp 开发遇到的主要问题&#xff1a;jsp 的痛点1.页面包含大量 java 代码&#xff0c;代码太混乱<% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head> &l…

webpack实现自动代码编译

前置 使用webpack构建开发的代码&#xff0c;为了运行需要有两个操作&#xff1a; 操作一&#xff1a;npm run build&#xff0c;编译相关的代码。操作二&#xff1a;通过live server或者直接通过浏览器&#xff0c;打开index.html代码&#xff0c;查看效果。为了完成自动编译&…

《图解TCP/IP》阅读笔记(第五章 5.7、5.8)—— IP隧道与其他IP相关技术

5.7 IP隧道 IP隧道技术顾名思义&#xff0c;是用于在两片网络区域间直接建立通信的通路&#xff0c;而绕过此间的其他网络的一种技术&#xff0c;如下图所示&#xff1a; 网络A与网络B使用IPv6技术&#xff0c;使用IP隧道技术&#xff0c;便可以绕过网络C。 那么其工作原理是…

机器学习 波士顿房价预测 Boston Housing

目录 一&#xff1a;前言 二&#xff1a;模型预测(KNN算法) 三&#xff1a;回归模型预测比对 一&#xff1a;前言 波士顿房价是机器学习中很常用的一个解决回归问题的数据集 数据统计于1978年&#xff0c;包括506个房价样本&#xff0c;每个样本包括波士顿不同郊区房屋的13种…

SQL - MySQL回表

一、回表概念&#xff1b;现象 回表&#xff0c;顾名思义就是回到表中&#xff0c;也就是先通过普通索引&#xff08;我们自己建的索引不管是单列索引还是联合索引&#xff0c;都称为普通索引&#xff09;扫描出数据所在的行&#xff0c;再通过行主键ID 取出索引中未包含的数据…

[附源码]计算机毕业设计Python创新创业管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Trie(Trie字符串统计)【实质就是二维数组 表示 链表】【二维数组的第一行就是 头结点】

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09; 文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点✔ 蓝色文字表示&#xff1a…

探索MapReduce

文章目录一&#xff0c;案例分析&#xff08;一&#xff09;TopN分析法介绍&#xff08;二&#xff09;案例需求二&#xff0c;案例实施&#xff08;一&#xff09;准备数据文件&#xff08;1&#xff09;启动hadoop服务&#xff08;2&#xff09;在虚拟机上创建文本文件&#…

ArcGIS中的OBJECTID、FID 和 OID 的区别!不要傻傻分不清

喜欢就关注我们吧 时常有很多我朋友分不清OBJECTID、FID 和 OID有什么区别&#xff0c;不懂得怎么应用和管理&#xff0c;今天我们来说个明白。 ArcGIS Desktop 产品要求独立表和属性表均具有 ObjectID字段&#xff0c;该字段包含唯一的长整型用于标识每个记录。 此 ID 由 Esri…

第二证券|元宇宙发展规划出炉,3只元宇宙概念股估值创年内新低

本月以来&#xff0c;北上资金加仓23只元国际概念股。 12月15日晚间&#xff0c;浙江省发改委等5部门联合印发《浙江省元国际工业开展举动计划&#xff08;2023—2025年&#xff09;》&#xff08;以下简称《计划》&#xff09;。《计划》中说到&#xff0c;到2025年&#xff0…

查找外文文献必备网站

查找下载外文文献不仅先要找到文献数据库资源&#xff0c;并且还需要有数据库的文献下载权限&#xff0c;如果你没有文献数据库使用权限就用下面这个方法。 文献党下载器&#xff08;wxdown.org&#xff09;有资源有权限&#xff0c;覆盖全科。下面举几个例子&#xff0c;用文…

脑电图分类任务中深度神经网络模型的数据增强:综述2021

Data Augmentation for Deep Neural Networks Model in EEG Classification Task: A Review 脑电图&#xff08;EEG&#xff09;的分类是测量神经活动节奏振荡的关键方法&#xff0c;是脑机接口系统&#xff08;BCI&#xff09;的核心技术之一。然而&#xff0c;从非线性和非平…

RNA-seq 详细教程:似然比检验(13)

学习内容 应用似然比检验 (LRT) 进行假设检验将 LRT 生成的结果与使用 Wald 检验获得的结果进行比较从 LRT 显著基因列表中识别共享表达谱似然比检验 在评估超过两个水平的表达变化时&#xff0c;DESeq2 还提供似然比检验作为替代方法。被确定为重要的基因是那些在不同因子水平…

Vue基础6

Vue基础6收集表单数据过滤器局部过滤器全局过滤器内置指令v-textv-html使用安全性cookie工作原理v-html不安全案例v-cloak指令v-once指令v-pre指令自定义指令函数式对象式自定义命名组合式全局自定义指令自定义指令总结&#xff1a;收集表单数据 <!DOCTYPE html> <ht…

VMware、linux虚拟机设置网络实现虚拟机与主机网络互通

需要配置三个方面才可以&#xff0c;即&#xff1a;WMware网络配置、windows主机网络配置、虚拟机网络配置。 首先&#xff0c;确认VMware虚拟机设置中配置的网络连接方式为&#xff1a;NAT模式 可以在VMware上方的菜单中找到&#xff1a;虚拟机---->设置&#xff0c;然后…

HC-SR04超声波测距模块介绍

超声波简介 超声波是由机械振动产生的, 可在不同介质中以不同的速度传播, 具有定向性好、能量集中、传输过程中衰减较小、反射能力较强等优点。超声波传感器可广泛应用于非接触式检测方法,它不受光线、被测物颜色等影响, 对恶劣的工作环境具有一定的适应能力, 因此在水文液位测…

毕业设计 - 基于JSP_Servlet校园二手交易平台设计于实现【源码+论文】

文章目录前言一、项目设计1. 模块设计2. 实现效果二、部分源码项目源码前言 今天学长向大家分享一个 java web 设计项目: 基于JSP/Servlet校园二手交易平台设计于实现 一、项目设计 1. 模块设计 系统完成的主要功能有&#xff1a;用户设置功能、发布信息功能、信息管理功能…

Android中AP和BP概念

AP和BP 大多数的手机都含有两个处理器。操作系统、用户界面和应用程序都在Application Processor(AP)上执行&#xff0c;AP一般采用ARM芯片的CPU。而手机射频通讯控制软件&#xff0c;则运行在另一个分开的CPU上&#xff0c;这个CPU称为Baseband Processor(BP)。 把射频功能放…

《API安全技术与实战》 读书笔记 API的前生今世和API安全的演进

文章目录一、API的前生今世&#xff08;1&#xff09;4中API表现形式&#xff08;2&#xff09;基于技术形式的类型划分的API二、API安全的演进&#xff08;1&#xff09;什么是API安全&#xff08;2&#xff09;常见的API安全漏洞类型一、API的前生今世 &#xff08;1&#x…