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

2023-05-16

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

题目:

从订单信息表(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()函数将字符串转换为日期类型,从而避免隐式类型转换的开销。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 注册Keil软件时出现“ TOOLS.INI: TOOLCHAIN NOT INSTALLED ”的解决办法

    当我们在注册keil软件时 xff0c 出现了 TOOLS INI TOOLCHAIN NOT INSTALLED 时 xff0c 首先看一下keil软件能不能正常使用 xff0c 如果keil软件能够正常使用证明安装是正确的 xff0c
  • go redis incr的使用

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 返回值代码示例 可用版本 xff1a gt 61 1 0 0 时间复杂度 xff1a O 1 为键 key 储存的数字值
  • MapReduce过程详解(非常全)

    MapReduce算法执行过程 核心思想 xff1a 分而治之 xff08 1 xff09 MapReduce框架使用InputFormat模块做Map前的预处理 xff0c 比如验证输入的格式是否符合输入定义 xff1b 然后 xff0c
  • HDFS读写流程(全面深入理解)

    1 HDFS写流程 xff08 1 xff09 客户端通过对FileSystem create 对象创建建文件 xff0c DistributedFileSystem会创建输出流FSDataOutputStream xff08 2 xff0
  • SHELL命令 -- 将命令的结果赋给变量

    如果想将文件夹中所有文件的名字赋给一个变量 xff0c 在shell命令中该如何实现呢 xff1f 1 使用反引号 var 61 96 ls 96 echo var 2 使用 var 61 ls echo var
  • 树莓派3B+无屏登录系统

    树莓派3B 43 无屏入门 本文章用于记录自己学习树莓派的心得和流程 xff0c 同时希望给他人一个参考 无屏入门 xff0c 并不是真正的无屏 xff0c 你需要笔记本电脑 我购买的是树莓派3b 43 无卡基础套餐 xff0c 5V2 5
  • Verilog | 4位数值比较器

    牛客上的一道题 xff0c 记录一下 这道题有两种思路 xff1a 第一种是按位比较 xff0c 列举出所有情况 xff1a module comparator 4 input 3 0 A input 3 0 B output wire Y
  • nvm切换node版本 npm版本未更新解决办法

    考虑受到全局npm影响 nvm uninstall 版本号 卸载版本号 nvm install 版本号 下载需要的版本号 删除c盘 用户配置文件下的 npmrc npmrc为全局配置文件 删除掉 恢复默认配置 nvm默认会切换npm npm
  • Ubuntu18.04——使用Remmina基于VNC协议远程连接Ubuntu客户端

    使用前需要确保被连接端已启动VNC iewer程序 安装Remmina sudo apt install remmina 使用Remmina基于VNC协议远程连接 启动remmina remmina 点击左上角的 43 修改协议为VNC 填
  • Ubuntu18.04——两台Ubuntu可以ping通但无法SSH

    问题描述 两台Ubuntu机器可以相互Ping通 xff0c 但是ssh失败 解决方法 SSH分客户端openssh client和openssh server 如果你只是想登陆别的机器的SSH只需要安装openssh client xff
  • 切换cuda版本的两种方式

    看正文之前 xff0c 最好先搞懂什么是环境变量 xff0c PATH环境变量的作用 xff0c 如何定义或修改环境变量 xff0c 软链接的概念 xff0c 什么是 bashrc文件 xff0c 如何创建软链接 xff0c 如何删除软链接
  • MySQL基础练习题

    1 xff09 查询出 goods 表中所有字段 2 xff09 查询出 goods 表中生产日期在一年前的商品 3 xff09 查询出 goods 表中商品名称中带 洗 字的商品 4 xff09 查询出 goods 表中商品编号为 2 4
  • 函数(new)

    函数 xff08 new 一 字符串处理函数 1 字符串的输入 xff08 1 xff09 scanf span class token macro property span class token directive keyword i
  • HTML,CSS中的复合写法总结

    CSS中的常用复合写法 表格常用属性字体属性的复合写法背景图片的复合写法边框的复合写法内边距 xff08 padding xff09 的复合写法外边距 xff08 margin xff09 的复合写法 一 表格常用属性 xff1a 属性含义
  • 无脑用CSS制作三角形及高级应用,看完别说你还不会!

    CSS的高级用法 有时我们在开发中会遇到如下的需求 xff1a 观察上面的图片 xff0c 我们看到第一张图片手机京东下面有一个凸出盒子的三角形 xff1b 第二张图片红色和白色有个斜线分割 xff0c 那么我们怎么实现这种效果呢 xff1
  • HTML中的空格、Tab、书名号大于号以及常用特殊符号

    HTML字符实体 在HTML页面中 xff0c 有一些特殊的符号我们想使用 xff0c 但是呢又不方便直接使用 xff0c 那么我们就可以用一些实体名称来代替 注 xff1a 实体名称对大小写敏感 特殊字符描述实体名称 空格 空格 amp
  • IDEA配置less文件自动编译(有图有真相)---我花了半个小时完成的配置,看完这篇你只需要十分钟。

    IDEA中配置less自动编译 先大概了解一下流程 xff0c 对配置有个整体的把握 安装node js安装lessIDEA中安装Node js插件IDEA中添加less组件IDEA中安装File Watchers插件配置File Watc
  • 书店销售管理系统----数据库原理及应用综合实验

    枯木逢春犹再发 xff0c 人无两度再少年 x1f342 系统主要模块如下 xff1a xff08 1 xff09 书店销售管理系统设计与实现 图书入库管理及查询统计 图书入库管理 xff1a 维护入库图书信息 xff08 如图书编号 书名
  • 【HQL - 查询用户的累计消费金额及VIP等级】

    水善利万物而不争 xff0c 处众人之所恶 xff0c 故几于道 x1f4a6 题目 xff1a 从订单信息表 order info 中统计每个用户截止其每个下单日期的累积消费金额 xff0c 以及每个用户在其每个下单日期的VIP等级 用户
  • HQL - 查询首次下单后第二天连续下单的用户比率

    水善利万物而不争 xff0c 处众人之所恶 xff0c 故几于道 x1f4a6 题目 xff1a 从订单信息表 order info 中查询首次下单后第二天仍然下单的用户占所有下单用户的比例 xff0c 结果保留一位小数 xff0c 使用百