MySQL窗口函数 和 阿里云日志留存率统计脚本实现

news2025/1/9 14:30:38

窗口函数的官方描述:窗口函数对一组查询行执行类似聚合的操作。但是,虽然聚合操作将查询行分组为单个结果行,但窗口函数会为每个查询行生成一个结果,发生函数评估的行称为当前行,与发生函数评估的当前行相关的查询行构成当前行的窗口。

诞生原因

  1.  之前 MySQL 5.6 的时候,支持将非 Group By 之后的数据呈现出来,到了 MySQL5.7 以后,除了参与 Group By 的列其他列都不能被展现出来了,这样带来一些不便;

  2. 此外,我们也希望在分组完成之后,对同一组内的数据进行一些加工之后重新生成一列新的数据,这一列往往是排序、总额(price * amount)等聚合信息,也可能是纵向的平均值,累加值,总和等等,总之这种函数式的处理需求最终会存放在新的列中;

  3. 当然,如果你不指定分组,那窗口函数就把所有结果作为一个组对待处理;

相关链接

MySQL窗口函数(一) - 掘金

通俗易懂的学会:SQL窗口函数 - 知乎

语法结构

  1. 在 * 后追加一个函数,即增加了一行新列 ranking,这行新列的数据是通过函数 rank() 获得的,该函数需要 order by 配合,不然不知道按哪个列排序,同时如果追加 partition by (按班级分组),则会在组内进行排序

  2. 这样的列可以增加不止一个,相互之间并不影响

  1. 整理完成之后相当于一个新表,该新表仍然遵守着 mysql 的其他查询语言的使用,比如继续分组和排序

  1. 还可以作为子表进行再次聚合查询

这里有个新知识,以前查询子表是不用给子表起名字的,现在 mysql 8 必须加个别名

  1.  聚合函数作为窗口函数使用的效果

  1. 结论一,带 order by 结果表现:

聚合函数当窗口函数使用的结果是支持相同分组下当前行以及当前行以上的聚合结果(所以必须要有排序),如下图很明显

  1. 不带 order by 结果表现:

不带 order by 就是对相同组内的直接聚合,不会按顺序进行处理,原知乎作者没有指出这一点

阿里云对窗口函数的支持

窗口函数的语法及示例_日志服务-阿里云帮助中心

阿里云日志文档中对窗口函数的讲解非常细致,每个都有案例

这里提一个 first_value(count),这是留存计算中用到的,代表着提取第一行中的 count 的值,以下是 15 日留存的 sql 语句这样就能更清楚地分析了,这里的 first_value(count) 提取就是当天安装的那批用户,他们就是第一批用户,每过 1 天

event_source: 5
AND install_time > 0
AND NOT user_id: ""
AND NOT user_id: "null" | 
WITH every_day_user AS (
  SELECT
    DISTINCT user_id,
    date_format(install_time / 1000, '%Y-%m-%d') AS install_day,
    date_format(event_time, '%Y-%m-%d') AS event_day
  FROM    log
  LIMIT
    100000
), live_day_user AS (
  SELECT
    date_format(install_day, '%Y-%m-%d') AS install_date,
    -- 安装时间
    date_diff ('day', install_day, event_day) AS live_day,
    -- 留存日期
    count(*) AS count -- 数量
  FROM    every_day_user
  WHERE
    install_day > date_add('day', -15, CURRENT_DATE)
    AND install_day <= event_day -- 安装时间在15日内的 且安装时间小于事件时间
  GROUP BY
    install_date,
    live_day
  ORDER BY
    install_date DESC,
    live_day ASC
  LIMIT
    100000
)
SELECT
  install_date,
  live_day,
  count,
  round(
    count * 100.0 / (
      first_value(count) over (
        PARTITION BY install_date
        ORDER BY
          live_day
      )
    ),
    2
  ) AS ratio
FROM  live_day_user
WHERE
  (
    to_unixtime (CURRENT_DATE)-to_unixtime (date_parse (install_date, '%Y-%m-%d'))
  ) >= live_day * 24 * 60 * 60
ORDER BY
  install_date DESC,
  live_day ASC
LIMIT
  100000

启发

  1. 阿里云日志的脚本编写方式,如何实现相当于 python 脚本的方式?

  2. 通过不断地创建子表的方式,然后通过一堆函数进行变换组合出新的列,这些带有新的列的数据形成新的数据表,不断地重复这个过程就能得到自己想得到的任何聚合数据;

  3. 数据库的思维方式和脚本语言的方式是相反的,脚本语言的是直接提取自己想要的数据出来,例如留存这个,我直接从今天安装人开始,往前推,昨天安装的用户,今天还活跃的有几人,这就牵涉两张表的对应,一张是昨天安装的,一张是今天活跃的,两者进行比对形成新数据,依次上推 15 天,这样比对的逻辑非常庞大,但反过来进行思考,先统计 15 天来所有的数据,按安装天数,事件发生天数,用户 ID 三者进行去重统计,再按安装日期和事件发生日期差值进行 group by 分组,count 所有用户数,这样就得到了安装日期,差 1 天,2 天,3 天用户总数,这就是留存

  4. 这样有可能缺少某一天的数据,有可能缺少差某天的数据,造成图表对应不上引起异常,但正常数据情况下不会缺失

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

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

相关文章

docker镜像导出和导入

1.容器镜像导出 我们先通过docker images查看需要导出的镜像 然后我们使用镜像导出命令 docker save -o /home/备份包名.tar 镜像id或镜像名 # -o(即output) 或 > 表示输出到文件备份镜像可以同时备份多个&#xff0c;空格分隔&#xff0c;这里建议使用镜像名备份&#xff…

DeepMind:用 GNN 学习通用推理算法

文 | 智商掉了一地小孩子才做选择&#xff0c;我的模型全&#xff01;都&#xff01;要&#xff01;近年来&#xff0c;基于深度神经网络的机器学习系统取得了巨大进步&#xff0c;尤其是在以感知为主的任务上。这一领域表现突出的模型通常要在分布中进行泛化&#xff0c;意味着…

Keras深度学习实战(43)——深度Q学习算法

Keras深度学习实战&#xff08;43&#xff09;——深度Q学习算法0. 前言1. Q 学习简介2. 使用 Q 学习进行 FrozenLake 游戏2.1 FrozenLake 环境分析2.2 模型分析2.3 使用 Q 学习算法解决 FrozenLake 问题3. 使用深度 Q 学习进行 CartPole 游戏3.1 问题分析3.2 模型分析3.3 使用…

通讯录怎么恢复?在 手机上检索找回已删除的电话号码的3种方式

不幸的是&#xff0c;我从手机中删除了一些号码&#xff0c;因此它也从帐户中删除了。我想恢复它们或将我的帐户恢复到一周前我拥有这些号码的日期。— 来自 Android 用户 像上述用户一样&#xff0c;您可能已经删除了一些电话号码&#xff0c;但希望有一天能恢复它们。这种事故…

python数据分析及可视化(十八)Power BI(数据获取、整理、清洗以及可视化、Power Query的基本操作、删除及增加列)

Power BI 微软推出的数据分析和可视化工具&#xff0c;用于在组织中提供见解&#xff0c;是商业分析工具&#xff0c;让视觉对象分析触手可及&#xff0c;可以创建交互式数据可视化效果和报表&#xff0c;连接数百个数据源、简化、准备数据等&#xff0c;并提供相应的分析&…

虚拟机Ubuntu设置固定IP与主机相互通讯

虚拟机Ubuntu设置固定IP与主机相互通讯1. 写在最前1.1 最好了解的预备知识1.2 虚拟机与主机三种连接方式1.3 写在最前2. VMware 虚拟机Ubuntu系统与主机共享IP2.1 配置VMware桥接网卡2.2 设置虚拟机为固定IP2.3 Vmware 虚拟机与主机互相通讯3. VirtualBox虚拟机Ubuntu系统与主机…

ContrastMask: Contrastive Learning to Segment Every Thing

摘要 部分监督实例分割是一种通过学习有限的base类和带注释的掩码来从novel类别中分割对象的任务&#xff0c;从而消除了沉重的注释负担。解决这一问题的关键是建立一个有效的类不可知掩码分割模型。与以前只在base类别上学习此类模型的方法不同&#xff0c;在本文中&#xff…

Nginx root 以及alias差别

1. 前言 今天的目的主要是梳理下在 nginx 中 root 以及 alias 在用法上有什么不同。其实这个问题看起来很简单。但是对于前端同学而言还是很困难的&#xff0c;毕竟有的前端同学都没弄过服务器 2. 结论 root 以及 alias 都是对 url 发起根目录进行控制。但是颗粒度有所不同roo…

【深基18.例3】查找文献(C++,图的遍历)

题目描述 小K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个&#xff08;也有可能没有&#xff09;参考文献的链接指向别的博客文章。小K 求知欲旺盛&#xff0c;如果他看了某篇文章&#xff0c;那么他一定会去看这篇文章的参考文献&#xff08;如果他之前已经看过这篇参…

JavaScript 中如何代理 Set(集合) 和 Map(映射)

ECMAScript6 中 Set 和 Map 的代理方法上一节&#xff1a;《JavaScript 中如何代理数组 》| 下一节&#xff1a;《JavaScript 中的反射&#xff08;Reflect&#xff09;原理与应用 》今日正在编写中&#xff0c;未完待续… jcLee95 邮箱 &#xff1a;291148484163.com CSDN…

Git分支操作

实操记录 假定非管理人员操作&#xff1a; 直推&#xff1a; 新建特性分支cbry&#xff1a; 刷新分支&#xff1a; checkout切换&#xff1a; 本地文件查看&#xff1a; 再merge&#xff1a; 就此&#xff0c;master的代码就合并到特性分支cbry&#xff1a; 新增内容&#xff…

数字化技术转型

这篇老生常谈&#xff08;我写过N次&#xff09;&#xff0c;是应一位IM群中的朋友的困惑问答汇集而成的。&#xff08;1&#xff09;学科分类我上学学的是计算机系。我上的大学一开始并没有计算机系&#xff0c;后来是电子工程系和数学系的老师抽调组成了计算机系。后来&#…

申请大学用的是IB预估分?

IB课程体系以其独特的优越性成为越来越多国际高中生的选择。如今全球共有3300多所高校接受IB成绩申请&#xff0c;其中包括美国常春藤盟校、英国G5在内的多所名校。 但是&#xff0c;大家知道吗&#xff0c;国内学习IB课程的学生是需要用预估分来申请大学的。今天&#xff0c;小…

多用户及时通信系统

目录1. QQ用户登录1.1 用户登录11.2 用户登录21.3 用户登录32. 拉取在线用户3. 无异常退出4. 私聊系统5. 群聊3. 发送文件3.1 服务端推送新闻3.2 离线留言和离线发文件1. QQ用户登录 1.1 用户登录1 qqcommon包下 User类序列化 Message消息类序列化 MessType接口 qqclient.ut…

拉伯杠杆平台|沪指上涨,大金融板块领涨,有股票连续5涨停!

A股周二上午全体小幅上涨&#xff0c;大金融集体上涨&#xff0c;推动指数上行&#xff0c;商场全体动摇不大。A50期货高开高走&#xff0c;盘中暴拉超2.6%。 不过&#xff0c;部分个股仍然动摇不小&#xff0c;有多只股票接连涨停。 别的&#xff0c;新股持续分解&#xff0c…

ATAC-seq分析:数据介绍(2)

1. 简介 ATACseq (Assay for Transposase-Accessible Chromatin using sequencing) 使用转座酶在测序前有效地片段化可访问的 DNA&#xff08;DNA可极性&#xff09;。结果提供了一种绘制可访问/开放染色质基因组范围的方法。 与其他技术相比&#xff0c;ATACseq 有几个优点&am…

嵌入式开发学习之--串口通讯(下)

提示&#xff1a;本篇来做一个关于串口的输入输出实验。 文章目录前言一、项目概况1.1、项目需求1.2、项目来源1.3、开发环境1.4、项目意义1.5、项目效果展示二、开发步骤2.1、涉及硬件电路2.2、项目代码2.2.1、串口配置总结前言 前一篇文章我们介绍了串口的几种类型以及串口标…

Linux Shell 编程,运算符,条件与分支,循环

Linux Shell 编程&#xff0c;运算符&#xff0c;条件与分支&#xff0c;循环1.Shell运算符2.判断语句3.for循环4.while循环1.Shell运算符 学习如何在shell中进行各种运算操作 案例&#xff1a;计算&#xff08;57&#xff09;3的值&#xff1a; #!/bin/bash res$(((57)*3)) …

游戏物体GameObject

在unity中所有游戏物体都是GameObject&#xff0c;这也是编程中的对象。 创建物体 在hierarchy窗口中&#xff0c;右击可以创建一个物体&#xff0c;当然也可以创建空物体。 物体属性 创建完物体后&#xff0c;一般可以在此处用这些工具来改变物体。 移动&#xff0c;旋转和…

戴尔科技集团助力中国石油大学打造现代数据中心

小的时候      总是幻想着      能够躺在床上上课      没想到现在竟然实现了      没错,对于当代大学生尤其是19级、20级来说,大学生活似乎是个虚无缥缈的词汇,因为相比与在校生活,在家上网课的时间可能会更长,一不留神就上了三年的“家里蹲”。      即使…