HQL - 查询首次下单后第二天连续下单的用户比率

news2024/11/13 9:34:51

水善利万物而不争,处众人之所恶,故几于道💦

题目:

从订单信息表(order_info)中查询首次下单后第二天仍然下单的用户占所有下单用户的比例,结果保留一位小数,使用百分数显示,

在这里插入图片描述

解题:

这个是大杂烩,select 套select …相信没人想看…

with a as(
  select user_id from(
    select user_id,create_date,next_order_date from (
      select
      user_id,
      create_date,
      lead(create_date,1) over(partition by user_id order by create_date) next_order_date,
      rank() over(partition by user_id order by create_date) rk
      from order_info
      group by user_id,create_date
    ) t1 where rk=1
  ) t2 where datediff(date(next_order_date),date(create_date))=1
), b as(
  select count(*) next_order_user from a 
), c as(
  select user_id from order_info group by user_id
), d as(
  select count(*) all_user from c
)
 
select concat(next_order_user/all_user*100,'%') percentage from b,d 

但是我又优化了一下👍

with a as(
  select 
    user_id,
    create_date,
    rank() over(partition by user_id order by create_date) rk,  --排序,标号
    lead(create_date,1) over(partition by user_id order by create_date) next_order_date
    --查询create_date,下一行的日期,以user_id分组,create_date升序排序,重命名为 next_order_date
  from order_info group by user_id,create_date  --这里分组是为了去掉每天重复的记录,一天只算一次
), b as(
select user_id,create_date,next_order_date from a where rk=1 --取出首次下单的那一条
), c as(
select user_id from b where datediff(date(next_order_date),date(create_date))=1 --过滤出隔天还下单的用户id
), d as(
select count(*) next_order_user  from c  --统计隔天还下单的用户数
), e as(
select user_id from order_info group by user_id  --查出下单用户的id
), f as(
select count(*) all_user from e  --统计下单用户的人数
)
select concat(next_order_user/all_user*100,'%') percentage from d,f  --算出百分比

和上面那种等价的,只不过是条件一块过滤了,不用分两次过滤:

with a as (
    select 
        user_id,
        create_date,
        lead(create_date, 1) over (partition by user_id order by create_date) next_order_day,
        rank() over (partition by user_id order by create_date) rk 
    from order_info
), b as(
  select 
      user_id
  from a
  where rk = 1 and datediff(date(next_order_day), date(create_date)) = 1
), c as( 
select count(*) next_order_user from b
), d as(
select user_id from order_info group by user_id
), e as(
select count(*) all_user from d
)

select concat(next_order_user/all_user*100,'%') percentage from c,e

总结:

lead(col,n, default_val):某一列往后数n条数据,lag()是往前数

date():将一个字符串类型的日期转换为日期类型

datediff(date1,date2):返回两个日期之间的日期差,参数可以是字符串,会隐式转换

concat(string A/col, string B/col…):将两个或多个字符串按顺序连接成一个字符串

1.使用多层的嵌套子查询,会导致多次扫描同一个表,效率变低,可以将第一层子查询语句作为一个独立的 with 子句来实现,避免多次扫描同一个表,语法是:

with first_table as(
   --子查询
), second_table as(
  --子查询,可以基于first_table查
)

使用这种语句书写 sql 可以更好地组织查询的逻辑,并且避免重复的表扫描操作,从而提高查询的性能。

2.尽量使用 date() 函数避免隐式转换

datediff()函数中,输入的值会被自动转换成日期类型。如果输入的不是日期类型,就会进行隐式类型转换,这会影响查询效率。我们可以使用date()函数将字符串转换为日期类型,从而避免隐式类型转换的开销。

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

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

相关文章

STL常用梳理——STRING

容器——string篇 STL简介String常见接口函数深度了解String构造函数拷贝构造赋值重载析构函数运算符重载查找 STL简介 STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统 称。现在主要出现在 c中,但是在引入 c之前该技术已…

Day959.架构现代化模式 -遗留系统现代化实战

架构现代化的新城区模式 Hi,我是阿昌,今天学习记录的是关于架构现代化的新城区模式的内容。 前面的四个现代化并不是层层递进的关系,而是既可以同时进行,也可以颠倒顺序。 比如,既可以先重构代码,再拆分…

在外远程NAS群晖Drive - 群晖Drive挂载电脑磁盘同步备份【无需公网IP】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 转发自CSDN远程穿透的文章:【…

DAY07_常用API下

1:String 1.1 String(构造方法) String类,它涉及到两个案例:用户登录和聊天室。 先来看用户登录案例:需要输入用户名和密码,和已知的用户名和密码进行比较,涉及到比较的方法, 一般来说&…

【Springboot+Vue+MP+ElementUI+axios项目实战记录】

写在最前:仅用于记录项目中遇到的问题,并不一定解决 1、 想要实现,点击配置自动跳转页面 2、 虽然使用了push追加了url,但是在跳转下一个,比如 配置跳转到用户会因为之前的url是http://localhost:8080/admin/pagetw…

【SpringBoot】MyBatisPlus代码生成器

项目准备 数据库 MySql 5.7 新建数据库votedb,新建两个测试表user、vote_theme user表 vote_theme表 建表代码如下 -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE…

muduo 网络库数据流分析

最近自己实现了一个 Tiny_WebServer 服务器,是一个半同步半反应堆的模式,具体可以看我 github 上面的描述。但是春招实习二面被面试官表示项目太简单了,疯狂被怼分布式、集群等知识,故想进一步重构项目,无奈我实现的 T…

Anaconda Prompt安装pytorch

详解Anaconda安装pytorch的全过程 1.首先切换Anaconda的镜像地址,切换的原因我想大家应该明白😊 在anaconda prompt中输入以下四行命令 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add ch…

医学图像分割之Attention U-Net

目录 一、背景 二、问题 三、解决问题 四、Attention U-Net网络结构 简单总结Attention U-Net的操作:增强目标区域的特征值,抑制背景区域的目标值。抑制也就是设为了0。 一、背景 为了捕获到足够大的、可接受的范围和语义上下文信息,在标…

Anaconda安装教程

最新Anaconda3安装教程 1.Anaconda3下载 官网下载地址 缺点: 下载速度比较慢,对速度有要求的小伙伴往下看 通过清华镜像加速的方式下载比较快 清华镜像加速地址 2.Anaconda3安装 双击安装包,点击next 点击 I agree 选择使用的用户&am…

攻防世界-Crypto-不仅仅是Morse

题目描述:题目太长就不拷贝了,总之,就是对以下字符进行解密 --/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--.-/.-/-./---/-/...././.-./..--.-/-.././-.-./---/-.././..../..../..../..../.-/.-/.-/.-/.-/-.../.-/.-/-.../-.../-.../…

QML应用动画(Applying Animations)

目录 一 扩展可点击图像元素版本2(ClickableImage Version2) 1 第一个火箭 2 第二个火箭 3 第三个火箭 动画可以通过以下几种方式来应用: 属性动画 - 在元素完整加载后自动运行; 属性动作 - 当属性值改变时自动运行&#xf…

通讯录的实现(静态入手版)

🍉博客主页:阿博历练记 📖文章专栏:c语言(初阶与进阶) 🎁代码仓库:阿博编程日记 🌹欢迎关注:欢迎友友们点赞收藏关注哦 文章目录 🍭前言&#x1f…

python学习之【类和对象】

前言 五一快乐! 上一篇文章python学习——【第八弹】中,给大家介绍了python中的函数,这篇文章接着学习python中的类和对象。 我们知道,python中一切皆对象。在这篇文章开始之前,我们先了解一下编程界的两大阵营——面…

[渗透教程]-004-长城防火墙GFW的原理

文章目录 1. baidu.com 请求过程2. GFW原理2.1 GFW拦截方法1:DNS渲染2.2 通过IP黑名单2.3 VPN阻断1. baidu.com 请求过程 家庭的路由器具备了交换机的功能.域名–>ip,优先检测本地的缓存,没有的话就查找DNS服务器,传输层对应该层的数据进行封装增加了端口的信息,网络层对传输…

[230502]英语阅读长难句分析|共6个

🍣五月份第二篇笔记🍣 40:0/3 41: 3/3 目录 题目 40-1 (1)句子结构分析 (2)生词 (3)原题 40-2 (1)句子结构分析 (2&#…

2022年度项目管理软件排名揭晓:哪些软件在市场中脱颖而出?

在项目管理软件的选择过程中,用户会倾向于参考一些软件排名来辅助自己进行选择。软件排名方面推荐参考G2,一个国外的靠谱软件评测网站,类似于软件版的“大众点评”,软件评价来自于真实用户,网站通过多维度的算法&#…

springboot3+react18+ts实现一个点赞功能

前端&#xff1a;vitereact18tsantd 后端&#xff1a;springboot3.0.6mybatisplus 最终效果大致如下&#xff1a; 后端&#xff1a; 引入pom依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring…

PMP/高项 03-项目进度管理

项目进度管理 概念 项目进度管理&#xff08;Schedule Management) 项目进度管理又叫项目工期管理&#xff08;Duration Management)或项目的时间管理(Time Management) 是一种为管理项目按时完成项目所需的各个过程 进度管理过程 规划进度管理 定义活动 排列活动顺序 估算活…

jQuery -- 常用API(上)

1. jQuery选择器 1.1 jQuery基础选择器 原生 JS 获取元素方式很多&#xff0c;很杂&#xff0c;而且兼容性情况不一致&#xff0c;因此 jQuery 给我们做了封装&#xff0c;使获取元素统一标准。 语法&#xff1a;$(“选择器”) // 里面选择器直接写 CSS 选择器即可&#xff…