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

news2024/10/6 22:26:00

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

诞生原因

  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 天

15日留存率脚本

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

15日留存率看板

留存率脚本总结

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

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

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

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

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

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

相关文章

Kubernetes证书热更新期限至100年【HA高可用集群】

一、问题与环境 1.为什么更新证书&#xff1f;局域网如何保障服务稳定性&#xff1f;   众所周知k8s&#xff08;Kubernetes&#xff09;有一个默认证书期限为一年不成文的规定&#xff0c;官方的解释是“最佳的做法是经常升级集群以确保安全。&#xff08;升级后集群证书自…

MySQL表的增删查改

目录 1、表的插入 <1> 全列插入 <2> 指定列插入 <3> 插入否则更新 <4> 替换 2、表的查找 <1>全列查询 <2>指定列查询 <3> where条件 <4> 筛选分页结果 3、表的修改 4、表的数据删除 5、查看表结构 6、插入查询结…

SpringCloud微服务项目实战 - 2.App登录及网关

如果你追求一个局部的更好甚至完美,你有可能花费巨大的资源和时间&#xff1b; 从总体上看&#xff0c;这往往意味着总体的浪费和失败&#xff0c;这是传说中的“打赢了战役打输了战争”。 系列文章目录 项目搭建App登录及网关 文章目录系列文章目录一、App登录1. 需求分析2. …

2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest K. The Robot

翻译&#xff1a; 有一个机器人在一个没有尽头的方格场上。最初&#xff0c;机器人位于坐标为(0,0)的单元中。他将执行由一串大写拉丁字母“L”、“R”、“D”、“U”所描述的命令。当一个命令被执行时&#xff0c;机器人只是朝着相应的方向移动: “L”:向左一个单元格(当前单…

【聆思CSK6 视觉AI开发套件试用】AI控制直流电机转速接口打通

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;oxlm 背景 在访问极术社区时&#xff0c;偶然发现聆思科技的CSK6开发板的评估活动&#xff0c;看CSK6的硬件配置和技术规格&#xff0c;300M…

JavaScript奇淫技巧:变速齿轮

JavaScript奇淫技巧&#xff1a;变速齿轮 在PC时代&#xff0c;曾有个名为“变速齿轮”的神奇软件&#xff0c;可以加快或减慢系统时间。 当时常用来修改游戏速度&#xff0c;可实现外挂一般的效果&#xff0c;很不可思议。 本文&#xff0c;将用JavaScript复刻这一功能&…

maven在无互联网(内网)环境下打包

Maven在内网环境打包 首先需要准备好项目所需的所有依赖包 我们可以在外网环境下&#xff0c;更改idea中Maven的local repository目录&#xff0c;然后刷新一下项目&#xff0c;将项目所需的依赖下载到更换的目录下 将新建的依赖目录和项目一起拷贝到内网环境下将依赖文件拷贝…

带你学懂数据结构中的八大排序(下)

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; 数据结构 | C语言 &#x1f38a;每篇一句&#xff1a; 图片来源 You can avoid reality, but you cannot avoid the consequences of avoiding reality. 你可以逃避现实&#xff0c;但你无法逃避其带来的后果…

《图解TCP/IP》阅读笔记(第八章 8.1~8.4)—— 概要,TELNET、FTP、SMTP、POP、IMAP协议介绍

前言 本篇篇幅较长&#xff0c;请耐心或者选择性阅读。 第八章 应用协议 从本篇开始&#xff0c;将介绍一些应用层协议&#xff0c;一般情况下&#xff0c;人们不太会在意网络应用程序实际上是按照何种机制正常运行的。本章旨在介绍TCP/IP中所使用的几个主要应用协议&#x…

项目管理中,培养高效项目团队的6大优势

大多数项目经理知道合作会促进生产力&#xff0c;并且对不同的团队都很有效。良好的团队合作使你能够顺利地运行不同的项目&#xff0c;克服障碍并实现目标。 它也会使完成项目所需的时间减少&#xff0c;并使资源得到更好的管理。更不用说&#xff0c;高质量的团队合作将有助…

第十四讲:神州交换机链路聚合配置

链路聚合&#xff08;Link Aggregation&#xff09;又称Trunk&#xff0c;是指将多个物理端口捆绑在一起&#xff0c;成 为一个逻辑端口&#xff0c;以实现出/入流量在各成员端口中的负荷分担&#xff0c;交换机根据用户配置的端口负荷分担策略决定报文从哪一个成员端口发送到对…

如何快速理解Python中的for循环?

人生苦短&#xff0c;我用python 这次来给大家带来一点干货&#xff0c; 我们将从一组基本例子和它的语法开始&#xff0c; 还将讨论与 for 循环关联的 else 代码块的用处。 然后我们将介绍迭代对象、迭代器和迭代器协议&#xff0c; 还会学习如何创建自己的迭代对象和迭代器…

微信小程序云开发之用户输入数据后excel表格导出升级版

大家好&#xff0c;我是csdn的小博主lqj_本人&#xff0c;最近在哔哩哔哩开始上传我的制作微信小程序的详细流程&#xff0c;大家可以关注一下哔哩哔哩&#xff1a;小淼前端 本次程序的详细视频教程已上传至哔哩哔哩&#xff1a; 腾讯云开发小程序之用户输入数据excel自动导出系…

HaaS EDU物联网项目实战:微信小程序实现云养花

HaaS EDU K1是一款高颜值、高性能、高集成度的物联网开发板&#xff0c;板载功能强大的4核&#xff08;双核300Mhz M33双核1GHz A7&#xff09;主芯片&#xff0c;2.4G/5G双频Wi-Fi&#xff0c;双模蓝牙&#xff08;经典蓝牙/BLE&#xff09;&#xff0c;并自带丰富的传感器与小…

第一章 vscode安装java环境

要在Visual Studio Code中配置Java环境&#xff0c;需要完成以下步骤&#xff1a; 安装Java Development Kit (JDK)。首先&#xff0c;你需要安装Java Development Kit (JDK)&#xff0c;这是Java的开发环境&#xff0c;包含了Java虚拟机、Java编译器和Java库等。可以前往Oracl…

Python基础知识入门(五)

Python基础知识入门&#xff08;一&#xff09; Python基础知识入门&#xff08;二&#xff09; Python基础知识入门&#xff08;三&#xff09; Python基础知识入门&#xff08;四&#xff09; 一、模块应用 模块是一个包含所有定义的函数和变量的文件&#xff0c;其后缀名…

2022年「博客之星」参赛博主:(天寒雨落)在等您评价 ~

目录 评价方法 参与规则 评选规则 评分规则 活动奖品 评价方法 点击链接&#xff1a;2022年「博客之星」参赛博主&#xff1a;天寒雨落-CSDN社区 在箭头所指位置做出打星评价。 参与规则 1.本次年度评选分为「博客之星|和「博客新星:以及「社区之星|。「博客新星:只针对…

Kafka — 1、基础介绍

1、消息队列简介 &#xff08;1&#xff09;同步&#xff1a;多个服务之间是同步完成一次请求 缺点&#xff1a; a. 性能比较差 b. 稳定性比较差&#xff0c;如果其中一个服务没有执行成功&#xff0c;则整个请求执行失败 &#xff08;2&#xff09;异步&#xff1a;加入【消息…

自动控制原理笔记-线性系统的稳态误差

目录 1.误差与稳态误差 2.计算稳态误差的一般方法 3.静态误差系数法 例题&#xff1a; 稳态误差是系统的稳态性能指标&#xff0c;是系统控制精度的度量。 这里讨论的只是系统的原理性误差&#xff0c;不包括非线性等因素所造成的附加误差。 计算系统的稳态误差以系统稳定…

洛谷千题详解 | P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题【C++语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; C源码2&#xff1a; C源码3&#xff1a; ------------------------------------------------------------------------------…