前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >能写数据后台,需要掌握哪些进阶的sql语句?

能写数据后台,需要掌握哪些进阶的sql语句?

作者头像
刘娟娟PRESSone
发布于 2019-10-26 09:21:37
发布于 2019-10-26 09:21:37
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

国庆假期花了一些时间,首次尝试并玩转 grafana,这几天继续不断优化和完善,如今看着自己的成果,相当满意。——逐步接近我想要的理想后台啦。

需求是不停歇的。今天我又给自己发掘了一些新需求,比如变量、筛选框之类,都收集下来等有空继续玩。编程学习的过程中,对于自己尚未尝试的新技能点,本能直觉会感到困难,但动手经验告诉我:莫慌,用起来就懂了,瞧我自己每次都能很快上手吖。——善于让自己在学习的过程中感受良好,并确实持续进步,自我激励是一个特别实用的软技能。

然后我想着不妨把这几天玩转 grafana 时用到的进阶版的 sql 语句整理出来。所谓进阶版,是针对我个人的 sql 能力啦,确切地讲,是指在我之前的笔记中未曾出现、且玩转 grafana 中我确实反复用到的。整理自己刚刚反复实践的新知识点,能很好地巩固新知。完成这件事,方能安心进入下一个阶段向未知冲刺。

之前写了一篇笔记,记录自己是为什么要玩 grafana ,以及如何在 24 H做到被工程师称赞,文中提及我把工程师已经实现的 sql语句拷贝下来,拆解为元知识点,然后逐个理解:它是什么功能,如何用,然后直接用起来试试效果。

举个实例来拆解元知识点

在本篇笔记中,我也先举一个实例用作知识点拆解,如下,该述语句的作用是:统计每天具有学习行为的用户数。注:学习行为其实包含多种具体的行为,分布在两个表中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with data as(
  select 
    date(created_at) as time,
    user_id
  from user_comments
  union all
  select 
    date(created_at) as time,
    user_id
  from user_activities
)
select
  time,
  count(distinct user_id) as 每日学习用户数
from data
group by time
order by time

注意:sql 对大小写、换行、缩进之类都不敏感,这是和 python不同的地方。上面之所以要换行和缩进,只是为了易读性。

这一条 sql 语句看着挺长,其实是两个部分。as 前面的 data 是数据的名字,我们自定义的,后面B部分的from 数据源就是它。被 with data as() 括起来的A部分,用于生成数据,相当于先做一次检索统计得到一些数据命名为 data ,然后再对 data 进行检索统计。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with data as (【语句块A)
【语句块B

可嵌套的 with data as()

短时间用 with data as() 用的比较多时,我就揣测:这玩意儿能嵌套吗?一试果然可行。嵌套只是让它看上去复杂点,本质没啥变化。如下所示,语句块 A 的数据源是原始数据,语句块 B 的数据源是 data,语句块 C 的数据源是 datax。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with datax as(
    with data as (【语句块A)
  【语句块B)
    【语句块C

实战中,我最多用过3层嵌套,且偶尔为之;双层嵌套用的多一些。而单层则相当常用。

union合并数据行

上方实例被 with data as() 括起来的部分,其实是两个表满足条件的数据合并。抽象一下如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
【语句块X】
union all
【语句块Y

处理表格数据的合并时,细分有以下三个情形:

  • 把多列或多行的数据,合并为单列或单行的数据
  • 把A表的数列,与B表的数列合并起来
  • 把A表的数行,与B表的数行合并起来

union 处理的是基于行的合并。举例来说,如果语句块X的结果为a行,语句块Y的结果为b行,则通过union all 合并后的结果将有(a+b)行。而用 union 的结果是取a和b的并集,即a、b中都存在的数据行只保留一份。

相对应的,在pandas 通过 pd.concat()axis参数就能处理行、列的不同方式合并,还真是简约吖。

函数data()as别名

上方举例中,语句块X 和Y大体上是蛮基础的语句。但依然出现了我之前没有用过的方法。

  • date(created_at) as time,count(distinct user_id) as 每日学习用户数 这两个片段中,as 之前是表达式语句,as 之后是该语句运算结果的别名。
  • date() 方法是把复杂的时间数据简化为年月日的日期数据。超高频使用。
  • count(distinct user_id) 则表示:对 user_id 去重,然后统计 user_id 个数。超高频使用。

类似count()sum()都是高频使用的基础函数。不过数据统计中,更常用到累加。语句是定番组合,就不再单独罗列啦:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum(兑换用户数) over (order by 兑换日期 asc rows between unbounded preceding and current row) as 累计用户数

count(1)count(*)count(column_name) 在不同情况下,运行效率不同。鉴于我暂时没有写出性能最好的sql语句之觉悟,暂不深究啦。

各种情况下的去重

上面提及distinct ,如何使用distinct 倒不复杂;复杂的是需求,对数据指标的定义要理解准确;不同的数据指标,对去重有不同的要求。

情境A:不去重。

虽然count的是user_id,但这个数据其实并不是每天留言的用户数,而是每天留言的条数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
    date(created_at) as time,
    count(user_id) as 每日留言条数
from
    user_comments
group by
    time
order by
    time
情境B:当日去重。

在当天内去重,跨天不去重。用户在某一天有多条留言,最终也只能为当天留言用户数贡献计数1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
    date(created_at) as time,
    count(distinct user_id) as 每日留言用户数
from
    user_comments
group by
    time
order by
    time
情境C:历史累积去重。

有过留言行为的累计用户数,则在全时段内去重。只要该用户曾有过留言行为,则计数1,不再重复计数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
  count(distinct user_id) as 留过言的用户总数
from
  user_comments
情境D:每日和历史累积同时去重。

假设我们想知道每日新增的留言用户数,即如果该用户以前曾留言则不计数,否则在首次留言当天计数1,这个情境比前面三种复杂点,但同样相当高频使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with data as (  
  select 
    distinct on (user_id) user_id, 
    date(created_at) as time
  from 
    user_comments
)
  
select 
  time,
  count(user_id) as 每日新增留言用户数,
  count(user_id) over (order by time asc rows between unbounded preceding and current row)  as 累积留言用户总数 
from data 
group by time,user_id
order by time

几个常见的小知识点

limit指定显示多少条数据。换言之,没有这个条件,就表示要显示查询结果的所有数据。我之前不知道这个知识点时,有时不小心直接在命令行提示符中查看某个表,会一下子打印很多很多行,以至于一直下翻都不见底……而在数据后台中,通常配合排序功能,用来显示“排行榜”数据。比如,学习次数排行榜、兑换总额排行榜之类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *  from table_name limit 50;

order by 指定数据按哪些字段排序,默认顺序,可用desc倒序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *  from table_name order by column_name;

group by指定数据按哪些字段分组,很多报表按日统计。前面举例中无形中也用了该方法数次,就不单独举例啦。

多表联合查询

最后说明下,相对复杂的多表查询。从多个表格、或表格和自定义数据源如data中合并查询。一个相对简单的实例如下,根据输入变量 user_name 从 users_extra 查询到 user_id,然后用 user_id 去user_activities 表查询。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with data as(
  select user_id,user_name from users_extra where user_name = '$user_name'
)
select
  count(1) as 学习行为次数
from 
  user_activities,data
where
  user_activities.user_id = data.user_id

这种联合查询必要的条件是,多个数据源可以通过某个字段对应起来。更复杂的例子,其实都可以动用拆解的方式,拆解为更单元的知识点。这里就不展开啦。

顺便说,上面的 user_name = '$user_name' 语句是 grafana 中用于调用自定义变量,实现后可支持下拉框筛选。这也是刚开始写这篇文章时,我提到的新需求,结果文章修修改改写完,这个需求竟然被我实现了。还真是快!

小结

如果某天你和我一样开始接触一点进阶、复杂的sql语句或其它技能,千万别慌,找一些现成的实例(比如收藏我这篇笔记)来消化,逐块拆解为元知识点,然后再把它们拼装结合用起来,你会发现:也不过如此嘛。

这个过程多像玩儿积木吖!好玩好玩!

如果这篇笔记帮到了你,一定要留言告诉我吖;这将鼓励我整理和分享更多。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小结 python 实战中遇到的几种需要化名的情境
笑来在《自学是门手艺》的《2.4.3 化名与匿名》中,讲到了函数的化名。经过几个月的实战,我发现,实际上化名无处不在。我有时也会称之为“别称”,意思一样。函数化名只是化名的一种应用场景,还有好几种使用化名的地方,本篇笔记将整理小结我所遇到的各种化名。
刘娟娟PRESSone
2019/10/26
3650
SQL 进阶指南:掌握这些高阶技巧,让你的数据分析快人一步!
你以为 SQL 只是简单的 SELECT * FROM table?那你可就大错特错了! 在这个数据驱动的时代,真正的高手早已抛弃低效的查询方式,玩转窗口函数、递归 CTE、动态透视表,甚至用近似计算让百亿级数据秒出结果! 还在为 SQL 运行慢、分析难、报表卡死而苦恼? 别担心,这篇文章带你深入 SQL 世界,从业务思维出发,手把手拆解 用户增长、行为分析、订单转化、留存率 等核心场景,让你的数据分析能力直接起飞!
用户9679163
2025/03/25
770
SQL 进阶指南:掌握这些高阶技巧,让你的数据分析快人一步!
数据分析师如何自力更生统计用户行为频次?
不懂数据分析的 growth hacker 不是好运营。近日我想要统计我家产品 xue.cn 用户的编程自学行为的频次,且在不给技术开发部门带来任何新需求的情况下自力更生。那么,我该如何定义并统计这个数据指标呢?
刘娟娟PRESSone
2019/10/25
8860
SQL | 数据分析面试必备SQL语句+语法
前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:“楼主能分享一下文科生怎么转行做数据分析吗??”、“SQL、python这些学起来好痛苦!”我看着屏幕苦笑,数据分析岗位现在的热门程度如果要形容的话,基本就是随便抓一个微博网友都知道这个岗位了。
咸鱼学Python
2020/03/24
3.2K0
SQL |  数据分析面试必备SQL语句+语法
SQL 从入门到放弃:ROW_NUMBER() OVER 和 ROLLUP
提起 SQL,(从前的)我脑子只有 SELECT、COUNT()、SUM()、JOIN、GROUP BY 等云云。对于较为复杂的数据场景,总是绞尽脑汁的用 GROUP BY 和 JOIN 来实现,却不知有类似功能的 SQL 函数。
小草学习屋
2023/11/22
5510
SQL 统计日活、周活指标
有一张用户访问记录表 user_trace,它记录了每个用户每次在APP上打开的页面和操作时间。
白日梦想家
2020/11/26
2.9K0
告别硬编码,mysql 如何实现按某字段的不同取值进行统计
上周我突然意识到,我在grafana上写的 sql 语句存在多处硬编码。这篇笔记将记录如何实现没有硬编码的sql语句,以及自学编程过程中如何应对自己的笨拙代码和难题不断的状况。
刘娟娟PRESSone
2019/10/25
2.6K0
告别硬编码,mysql 如何实现按某字段的不同取值进行统计
【测试SQLite】测试SQLite支持的SQL语句分类
为了全面测试SQLite支持的SQL语句,需要设计一个包含多种类型的表结构,并编写各种SQL语句来测试这些功能。目前按照以下分类进行测试:
SarPro
2024/05/24
3800
【测试SQLite】测试SQLite支持的SQL语句分类
面试过了!业内大厂MySQL笔试题回忆+拆解
现有注册用户表table_user,有两个字段:user_id(用户id)、reg_tm(注册时间)。有订单表table_order,有三个字段:order_id(订单号)、order_tm(下单时间)、user_id(用户id)。
CDA数据分析师
2019/08/06
1.4K0
实用 SQL 语句收藏这篇就够了
语法:create index index_name on table_name (column_name)
我是一条小青蛇
2019/10/23
9380
数仓用户行为漏斗分析如何SQL实现(第二节)
如果不考虑2019-02-11和2019-02-12的新增用户:2019-02-10新增100人,一天后它的留存率是30%,2天12号它的留存率是25%,3天后留存率32%;
小晨说数据
2022/03/09
1K0
数仓用户行为漏斗分析如何SQL实现(第二节)
数据分析人员需要掌握SQL到什么程度?3个常考题目刷一刷
在数据类岗位招聘过程中,经常会考察求职者的SQL能力,这里整理了3个常考的SQL数据分析题,按照由简单到复杂排序,一起来测试一下你掌握了么?
博文视点Broadview
2022/01/21
7660
数据分析人员需要掌握SQL到什么程度?3个常考题目刷一刷
oracle数据库sql语句优化(循环语句有几种语句)
当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来,
全栈程序员站长
2022/08/01
2.9K0
mysql 数据分析如何实现日报、周报、月报和年报?
以天为统计周期,是常见需求。周报、月报更是常见需求。长周期项目,甚至有年报需求。我已经掌握了mysql中按天统计,如何实现按年、按月、按周统计呢?
刘娟娟PRESSone
2019/10/26
2.9K0
12000字!实战案例!Python+SQL京东用户行为分析
项目对京东电商运营数据集进行指标分析以了解用户购物行为特征,为运营决策提供支持建议。本文采用了MySQL和Python两种代码进行指标计算以适应不同的数据分析开发环境。
用户6888863
2023/03/01
2K3
12000字!实战案例!Python+SQL京东用户行为分析
如何用SQL实现用户行为漏斗分析
1 每日活跃设备明细 dwd_start_log--->dws_uv_detail_day
大数据学习与分享
2022/05/19
2.2K0
如何用SQL实现用户行为漏斗分析
这5个超级经典SQL都不会,回去等通知吧
可以用反向思维,先查询出表里面有小于 80 分的 name,然后用 not in 去除掉
不吃西红柿
2022/09/19
3000
这5个超级经典SQL都不会,回去等通知吧
电商用户行为数据分析系统的设计与实现_基于大数据的用户行为分析
本文针对淘宝app的运营数据,以行业常见指标对用户行为进行分析,包括UV、PV、新增用户分析、漏斗流失分析、留存分析、用户价值分析、复购分析等内容; 本文使用的分析工具以MySQL为主,涉及分组汇总,引用变量,视图,关联查询等内容。
全栈程序员站长
2022/11/10
4.9K1
电商用户行为数据分析系统的设计与实现_基于大数据的用户行为分析
SQL系列(二)最常见的业务实战
本文将通过构建三张表,几个SQL实例带大家掌握最常见的业务需求,同时这些实例也覆盖了面试中80%的考点。
HsuHeinrich
2023/02/24
3K0
SQL系列(二)最常见的业务实战
SQL优化篇:如何成为一位写优质SQL语句的绝顶高手!
写SQL语句不难,稍微系统学习过数据库相关技术的人都能做到,但想要写好SQL却也不是一件易事,在大多数编写SQL的时候,很多人都是以实现需求为原则去撰写的,当一条SQL写出来之后,只要能满足业务需求就行,不会考虑它有没有优化点,能不能让它跑的更快。
田维常
2023/08/31
1.4K0
SQL优化篇:如何成为一位写优质SQL语句的绝顶高手!
推荐阅读
相关推荐
小结 python 实战中遇到的几种需要化名的情境
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文