当前位置: 首页 > news >正文

Hive SQL必刷练习题:留存率问题(*****)

留存率:

首次登录算作当天新增,第二天也登录了算作一日留存。可以理解为,在10月1号登陆了。在10月2号也登陆了,那这个人就可以算是在1号留存

今日留存率 = (今日登录且明天也登录的用户数) / 今日登录的总用户数 * 100%

在这里插入图片描述

解决思路:

​ 这类问题主要借助left join,根据原表的数据,先去找到每个用户最先登录的时间,这个就是通过对用户group by,然后搜索date_format(min(login_ts),‘yyyy-MM-dd’)。这样就得到一个表,第一列是用户id,第二列就是每一个用户第一次登录的日期。

​ 之后用这个新表,left join原表数据,但是这个条件不仅是id相等,还要有个t1.user_id=t2.user_id and datediff(date_format(t2.login_ts,‘yyyy-MM-dd’),t1.first_login)=1

说实话,这个多条件join的还确实没遇到过。这样符合条件的就会被增加到后面,不符合的赋空值。【当然也可以不多条件join,直接就是两个表的user_id一样,那这样再计算新增人数和留存人数的时候,就不能直接通过count(列名字)来计算了,还需要去重和判断天数关系】比如下图这样

在这里插入图片描述

这样就可以根据first_login分组group by计算count(t1.id),就是每日新增人数,然后count(连接上的表的列信息),就是后续一天也登陆的人数。

代码:

selectt3.first_login,t3.register,t3.remain_1/t3.register retention
from(selectt1.first_login,count(t1.user_id) register,count(t2.user_id) remain_1from(selectuser_id,date_format(min(login_ts),'yyyy-MM-dd')   first_loginfromuser_login_detailgroup byuser_id)t1left joinuser_login_detail t2ont1.user_id=t2.user_id and datediff(date_format(t2.login_ts,'yyyy-MM-dd'),t1.first_login)=1group byt1.first_login
)t3

总结一下:

其实这类问题的关键在于,你要想办法将每个用户的最初登录时间和第二天登录时间这两个信息,放到一行中。这就是先求出来初次登陆时间后,然后借助这个表进行left join,之后再此基础上以最初登录时间进行分组group by,再用聚合函数即可。

但是还有一种思路,就是直接进行开窗排序,然后用row_number排序,找到前两名的日期,这个用where筛选,并且在查询条件里面用max,和min聚合函数可以找到首日和第二日,第一个日期就是首日,第二个就是第二次登录日期,只要看这个第二次登录日期是不是首日的第二天就行

上代码:

SELECTconcat(round(sum(if(datediff(f2, f1) = 1, 1, 0)) / count(*) * 100, 1), '%') percentage  -- 注意round保留一位小数的用法
from(
selectuser_id,min(create_date) f1,max(create_date) f2from(
SELECTuser_id,create_date,row_number() over(partition by user_id order by create_date) num
from(selectuser_id,create_dateFROM order_infogroup by user_id,create_date
)t1)t2where num<=2group by user_id
)t3

相关文章:

Hive SQL必刷练习题:留存率问题(*****)

留存率&#xff1a; 首次登录算作当天新增&#xff0c;第二天也登录了算作一日留存。可以理解为&#xff0c;在10月1号登陆了。在10月2号也登陆了&#xff0c;那这个人就可以算是在1号留存 今日留存率 &#xff08;今日登录且明天也登录的用户数&#xff09; / 今日登录的总…...

在Linux/Ubuntu/Debian中创建自己的命令快捷方式

虽然图标快捷方式使你移动鼠标双击就打开目标&#xff0c;但是你还是需要先定位到它。而在终端Terminal中你只需要输入一个自定义命令就能一步到位。 要在 Ubuntu 中创建你自己的命令或别名&#xff0c;你可以使用主目录中的“.bashrc”文件。 以下是创建通过 Wine 运行 Photo…...

vue学习笔记——Vue3循环生成表单时,对每一行新生成的数据添加表单验证的方法

应用场景&#xff1a; 在form表单内&#xff0c;动态生成一个数组类型的一组数据&#xff0c;要求对生成的每一组数据内容进行表单验证。例如动态添加人员&#xff0c;并对每个人的人员的信息输入框进行表单验证。 解决思路&#xff1a; 把rules的验证规则循环写在element ui的…...

用C++做一个植物大战僵尸

制作一个完整的“植物大战僵尸”游戏是一个非常大的项目&#xff0c;涉及图形渲染、碰撞检测、用户输入处理、音效、动画、游戏逻辑等多个方面。由于这个话题非常广泛&#xff0c;我可以提供一个简化的版本或者一个框架来启动你的项目。 以下是一个简化的框架&#xff0c;帮助…...

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(三)—— 随机梯度下降

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 这篇文章中&#xff0c;咱们将使用Keras和TensorFlow…...

普通用户无法连接到docker服务

环境 tt:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy问题 tt:~$ sudo apt install docker.io -ytt:~$ docker info Client:Version: 24.0.5Context: d…...

Rancher(v2.6.3)——Rancher部署Nginx(单机版)

Rancher部署Nginx详细说明文档&#xff1a;https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#5rancher%E9%83%A8%E7%BD%B2nacos ps&#xff1a;如果觉得作者写的还行&#xff0c;能够满足您的需求&#x…...

java问题解释

问题1&#xff1a;请解释Java中的异常处理机制&#xff0c;并讨论其在软件开发中的重要性。 回答&#xff1a; Java中的异常处理机制是一种强制性的错误处理机制&#xff0c;它允许程序在运行时检测到异常情况&#xff0c;并采取适当的措施进行处理。异常是在程序执行过程中发…...

TSN协议原理!看完这一篇就够了(1)——时钟同步IEEE802.1AS-2020

▎前言 在许多应用场景中&#xff0c;一个本地局域网中互联的设备集群需要共享同一个时间&#xff0c;以支持各设备的协同工作。例如&#xff1a;音频设备与视频设备的配合播放&#xff0c;雷达与摄像头的数据融合等&#xff1b;这样一个看似简单的域功能&#xff0c;细化成为…...

Intel被喷惨的大小核CPU终于有救,12、13代也沾了光

2021年 Intel 将混合架构引入 PC &#xff0c;至今也没能让所有用户接受这一改动。 虽然 PE 核心设计 帮助我们更好理解鸡兔同笼问题 带来了额外的多线程性能提升&#xff0c;但对于游戏玩家们可就不那么友好了。 关了吧觉得亏&#xff0c;不关吧又要时不时担心大核偷懒、小核…...

JAVA入门第一步

学习总结&#xff1a; 打开CMD常见的CMD命令 一、打开CMD CMD的概念 CMD是Windows操作系统中的命令提示符(Command Prompt)程序&#xff0c;它是一种命令行工具&#xff0c;可以让用户通过键入命令来与计算机进行交互。CMD是Windows中一个基本的系统组件&#xff0c;它提供了一…...

【scala】使用gradle和scala构建springboot程序

零、版本说明: springboot: 2.7.18 使用log4j2&#xff0c;不使用springboot自带的logback scala版本&#xff1a;2.11 jackson版本&#xff1a;2.16.0 一、依赖&#xff1a; buildscript {dependencies {// using spring-boot-maven-plugin as package toolclasspath("…...

Linux sfdisk命令教程:硬盘分区表编辑器(附实例详解和注意事项)

Linux sfdisk命令介绍 sfdisk是一个用于编辑硬盘分区表的命令。它与fdisk和cfdisk类似&#xff0c;但具有更多的功能。此外&#xff0c;与这两个程序不同&#xff0c;sfdisk可以非交互式地运行。它通常用于从脚本中对驱动器进行分区&#xff0c;或用于分区表的备份和恢复。 L…...

Godot 学习笔记(5):彻底的项目工程化,解决GodotProjectDir is null+工程化范例

文章目录 前言GodotProjectDir is null解决方法解决警告问题根本解决代码问题测试引用其实其它库的输出路径无所谓。 工程化范例环境命名规范Nuget项目结构架构代码ISceneModelIOC服务 测试GD_Extension 通用扩展TestUtils GD_ProgramTestServiceMainSceneModel Godot对应的脚本…...

算法打卡day23|回溯法篇03|Leetcode 39. 组合总和、40.组合总和II、131.分割回文串

算法题 Leetcode 39. 组合总和 题目链接:39. 组合总和 大佬视频讲解&#xff1a;组合总和视频讲解 个人思路 这道组合题主要是有总和的限制&#xff0c;当递归和超过了总和就return&#xff0c;递归时加上回溯去遍历数组。 解法 回溯法 把组合问题抽象为如下树形结构 如上…...

Google研究者们提出了VLOGGER模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Python从入门到精通秘籍十九

一、Python之union 联合类型注释 当谈论Python中的联合类型注释时&#xff0c;通常会提到Union类型。Union是typing模块中定义的一个泛型类&#xff0c;用于表示多个可能的类型。 Union的语法如下&#xff1a; Union[type1, type2, ...]其中type1, type2, … 是要组成联合类…...

解决:您还有0天的时间继续使用internet download manager

通过修改注册表来白嫖的IDM方法 1、新建txt文件复制代码&#xff08;命名为idm.reg&#xff09; 2、代码如下 Windows Registry Editor Version 5.00[-HKEY_CURRENT_USER\Software\Classes\CLSID\{7B8E9164-324D-4A2E-A46D-0165FB2000EC}] [-HKEY_CURRENT_USER\Software\Clas…...

操作系统目录

北航操作系统 chapter 1 北航操作系统 chapter3-1 内存管理 北航操作系统chapter3-2 内存管理 北航操作系统chapter3-3 页式管理 北航操作系统chapter3-4 段式管理 北航操作系统chapter3-5 虚拟内存管理 操作系统chapter4-1 进程与线程 北航操作系统-chapter4.2 同步与互斥…...

常用的Node.js命令集锦

当使用Node.js开发时&#xff0c;以下是一些常用的Node.js命令集锦&#xff1a; npm init 用于初始化一个新的Node.js项目&#xff0c;并创建一个package.json文件来管理项目的依赖和元数据。 npm install [package-name] 用于安装指定的Node.js包&#xff0c;可以通过--save选…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...