同样使用窗口函数完成的表值函数 生成1000万条数据记录 数据源结构 使用循环和随机函数,实现删除10万条数据,因测试时先建了索引再删除数据,慢得一塌糊涂,最终中途中止了,没有实际删除这么多数据。...增加聚集索引 算法代码演示 数据差距范围 此部分计算的逻辑是将每个用户分组下本来连续的序号中,缺失了某些记录,这些缺失的部分对应的区间范围,若缺失的为连续的,返回连续的区间,若缺失为单个记录,返回首尾相同的序号...而最终的结果只会取nxt和cur之差大于1的记录,即开始有缺失产生差距的行记录。...为97、nxt为100,此行记录是我们后面where条件要筛选出来的记录行(模拟删除数据过程中,尽量删除连续的两条记录,让差距结果更清晰)。...下一步对排名产生的相同的数值进行分组汇总,连同用户字段,最终可统计出某用户在某个差异值grp下的连续区间。
as sum_amont,达到一个累积计算sum的功能 这种需求在没有窗口函数的情况下,用纯sql写起来,也够蛋疼的了,就不举例了。...平时我们比较痛恨一句sql几十行甚至上上百行,根本不知道其要表达什么,难以理解,对于这种SQL,可以使用CTE分段解决, 比如逻辑块A做成一个CTE,逻辑块B做成一个CTE,然后在逻辑块A和逻辑块B...这里不做细节演示,仅演示一种递归的用法,用递归的方式生成连续日期。 当然递归不会无限下去,不同的数据库有不同的递归限制,MySQL 8.0中默认限制的最大递归次数是1000。 ...关于CTE的限制,跟其他数据库并无太大差异,比如CTE内部的查询结果都要有字段名称,不允许连续对一个CTE多次查询等等,相信熟悉CTE的老司机都很清楚。...窗口函数和CTE的增加,简化了SQL代码的编写和逻辑的实现,并不是说没有这些新的特性,这些功能都无法实现,只是新特性的增加,可以用更优雅和可读性的方式来写SQL。
SQL系列(二)最常见的业务实战 本文将通过构建三张表,几个SQL实例带大家掌握最常见的业务需求,同时这些实例也覆盖了面试中80%的考点。...计算每日练习次数、练习新用户数(以前未做过练习,今日开始做练习算作今日的练习新用户)、累积练习次数(每月单独汇总)、累积占比(每月单独汇总) 每日练习次数排名前三的试卷ID 知识点:三大窗口函数的应用...常见的方法有三种:row_number、lag/lead、sum(if[exp])。其核心是按照日期排序,将连续的日期等换成同一分组。...不过有些约定俗成的建议给到各位: 良好的代码风格 SQL是一个非严格的格式化要求语言,因此一个优秀的数据分析师应该养成自己良好的代码风格。如果没有的话,可以参考笔者的SQL代码风格。...简单的一句话:当你知道如何最正确的使用count()和count(distinct)时,你的逻辑就是清晰的。 最后,给大伙出道简单的综合题吧:给定起始值和结束值(均为整数),构造步长为1的等差数组。
日期的操作函数 时间和秒钟转换的函数 计算日期和时间的函数 日期的格式化与解析 流程控制函数 加密与解密函数 MySQL信息函数 其他函数 聚合函数(多行函数) AVG和SUM函数 MIN和MAX函数...三、SQL规则与规范 规则与规范区别:规则是必须遵守的,规范可以不用遵守。 SQL规则 SQL语句可以写成一行或多行。为了提高可读性,各子句分行写,必要时缩进。...4、函数体也可以用BEGIN…END来表示SQL代码的开始和结束。如果函数体只有一条语句,也可以省略BEGIN…END。...语句内的语句或语句群被重复,直至结束循环表达式为真。...(LOOP、REPEAT和WHILE语句)内,表示结束本次循环,开始下一次循。
窗口函数 窗口函数lead使用方法: image.png 默认值是指:当向上N行或者向下N行值时,如果已经超出了表行和列的范围时,会将这个默认值作为函数的返回值,若没有指定默认值,则返回Null。...窗口函数lead可以获取每个字段的后面的第n个值,并生成新的一列。 而这道题描述的“用户连续登陆”中的“连续”可以理解为用户当前的登陆日期与本月下一次登陆日期相差一天。...从结果看,我们可以获得以下信息: 1)当“日期”与“用户当月下一个登陆日期”只相差一天,即用户本次登陆为连续登陆; 2)当“日期”与“用户当月下一个登陆日期”相差大于一天,即用户本次登陆为连续登陆的最后一天...将这两种情况过滤出来之后,用户连续登陆天数为:当前登陆顺序减去上一个登陆顺序。...汇总分析 最后获取“每个月,每个用户连续登陆的最多天数”,使用group by函数。
定义了一个O1的派生表,返回所有订单日期='20070101'的订单,外部查询返回派生表的所有行。 在这个例子中,其实不需要派生表,只是为了演示派生表的语法。...表表达式是一个表,而关系表中的行驶没有固定顺序的,所以 ANSI SQL 不允许表表达式查询语句中出现ORDER BY字句。...5.练习题 1.写一个查询,为每个雇员返回其订单日期最近的所有订单(用派生表) 期望结果: ?...当外部查询结束,公用表表达式的生命周期就结束了。 3.使用参数 和派生表一样,可以引用参数。...本题分两个步骤: 1.查询出基于orderdate,orderid排序的结果集,然后将这个查询语句用CTE来表示 2.查询第一步结果集中11~20之间的行 WITH O1 AS ( SELECT orderid
fi done echo "日期为$a" } 打印日期段所有日期{ #!...{ sed '{N;s/\n//}' file # 将两行合并一行(去掉换行符) awk '{printf(NR%2!...$0" ":$0" \n"}' # 将两行合并一行 awk '{printf"%s ",$0}' # 将所有行合并 awk '{if...(NR%4==0){print $0} else {printf"%s ",$0}}' file # 将4行合并为一行(可扩展) } 横竖转换{ cat a.txt...Thread;i++));do echo;done >&6 #此后标准输入将来自fd5 exec 5<$CurFileName #开始循环读取文件列表中的行
多条 SQL 语句必须以分号(;)分隔。 处理 SQL 语句时,所有空格都被忽略。SQL 语句可以写成一行,也可以分写为多行。...-- 一行 SQL 语句 UPDATE user SET username='robot', password='robot' WHERE username = 'root'; -- 多行 SQL 语句...DISTINCT 用于返回唯一不同的值。它作用于所有列,也就是说所有列的值都相同才算相同。 LIMIT 限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。...注意:在 MySQL 中,分号 ; 是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL 可以开始执行了。...因此,解释器遇到触发器执行动作中的分号后就开始执行,然后会报错,因为没有找到和 BEGIN 匹配的 END。 这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思)。
多条 SQL 语句必须以分号(;)分隔。 处理 SQL 语句时,所有空格都被忽略。SQL 语句可以写成一行,也可以分写为多行。...-- 一行 SQL 语句 UPDATE user SET username='robot', password='robot' WHERE username = 'root'; -- 多行 SQL 语句...注意:在 MySQL 中,分号 ; 是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL 可以开始执行了。...因此,解释器遇到触发器执行动作中的分号后就开始执行,然后会报错,因为没有找到和 BEGIN 匹配的 END。 这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思)。...在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了 NEW 和 OLD MySQL 中定义了 NEW 和 OLD 关键字,用来表示触发器的所在表中,触发了触发器的那一行数据。
如果您注意到,CTE很有用,因为您可以将代码分解为较小的块,但它们也很有用,因为它允许您为每个CTE分配变量名称(即toronto_ppl和avg_female_salary) 同样,CTEs允许您完成更高级的技术...,对行和价值进行排名。...在SQL中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。...Rank()返回从1开始的每行的唯一编号,除了有关系时,Rank()将分配相同的数字。同样,差距将遵循重复的等级。 dense_rank()类似于Rank(),除了重复等级后没有间隙。...您应该肯定会期望某种涉及日期时间数据的SQL问题。
如果您注意到,CTE很有用,因为您可以将代码分解为较小的块,但它们也很有用,因为它允许您为每个CTE分配变量名称(即toronto_ppl和avg_female_salary) 同样,CTEs允许您完成更高级的技术...,对行和价值进行排名。...在SQL中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。...Rank()返回从1开始的每行的唯一编号,除了有关系时,等级()将分配相同的数字。同样,差距将遵循重复的等级。 dense_rank()类似于等级(),除了重复等级后没有间隙。...示例问题:给定天气表,写一个SQL查询,以查找与其上一个(昨天)日期相比的温度较高的所有日期的ID。
如果您注意到,CTE很有用,因为您可以将代码分解为较小的块,但它们也很有用,因为它允许您为每个CTE分配变量名称(即toronto_ppl和avg_female_salary) 同样,CTEs允许您完成更高级的技术...在SQL中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。...Rank()返回从1开始的每行的唯一编号,除了有关系时,等级()将分配相同的数字。同样,差距将遵循重复的等级。 dense_rank()类似于等级(),除了重复等级后没有间隙。...您应该肯定会期望某种涉及日期时间数据的SQL问题。...示例问题:给定天气表,写一个SQL查询,以查找与其上一个(昨天)日期相比的温度较高的所有日期的ID。
,输出连续交易的开始日期和结束日期,以及连续交易的天数 +------------+-------------+-------------+---------------+ | cust_name |...并且题目中要求统计连续日期的起始和截止日期、连续天数都是判断完连续后的附加问题。...,对交易日历进行排序,得到一个连续交易日期的连续序列,以便进行判断是否连续。...我们使用lag取上一行的rn与当前行rn进行差值计算,确认是否连续,连续的记为0不连续的记为1。...,计算出开始日期,结束日期,连续天数 根据用户和分组ID进行分组,得到每个连续组,然后计算出题目要求内容 执行SQL select cust_name, min(trd_date) as
如果您注意到,CTE 很有用,因为您可以将代码分解为较小的块,但它们也很有用,因为它允许您为每个 CTE 分配变量名称(即 toronto_ppl 和 avg_female_salary) 同样,CTEs...,对行和价值进行排名。...在 SQL 中,您可以使用几种方式将 “等级” 分配给行,我们将使用示例进行探索。...Rank()返回从 1 开始的每行的唯一编号,除了有关系时,等级()将分配相同的数字。同样,差距将遵循重复的等级。 dense_rank()类似于等级(),除了重复等级后没有间隙。...示例问题:给定天气表,写一个 SQL 查询,以查找与其上一个(昨天)日期相比的温度较高的所有日期的 ID。
一、连续问题(14 天连续登录) 假设您有一个user_login表,包含user_id(用户ID)和log_date(用户每次登录的时间戳)字段,我们想要找出连续10天登录过的用户。...下面是一个更简洁易懂的解释以及对应的SQL查询模板: 实现思路: 因为每天用户登录次数可能不止一次,所以需要先按照用户每天的登录日期去重计算。...计算登录日期减去第二步骤得到的结果值,用户连续登录情况下,每次相减的结果都相同。 按照id和日期分组并求和,筛选大于等于7的即为连续7天登录的用户。...在RankedPurchases的CTE(公共表表达式)中,我们使用ROW_NUMBER()窗口函数对每个用户的购买记录按照购买日期进行排序。...PARTITION BY user_id表示我们为每个用户单独编号,ORDER BY purchase_date ASC表示按照购买日期进行升序排列。这样,每个用户的首次购买记录将被编号为1。
| 从其他数据库管理系统(例如 MySQL、Oracle 和 Microsoft SQL Server)迁移到 PostgreSQL。...内连接 从一个表中选择在其他表中具有相应行的行。 左连接 从一个表中选择行,这些行在其他表中可能有也可能没有对应的行。 自连接 通过将表与自身进行比较来将表与其自身连接。...分组集、多维分组和汇总 主题 描述 分组集 在报告中生成多个分组集。 CUBE 定义多个分组集,其中包括所有可能的维度组合。 ROLLUP 生成包含总计和小计的报告。 第 7 节....EXISTS 检查子查询返回的行是否存在。 第 8 节. 公共表表达式 主题 描述 PostgreSQL CTE 向您介绍 PostgreSQL 公共表表达式或 CTE。...主题 描述 插入 指导您如何将单行插入表中。 插入多行 向您展示如何在表中插入多行。 更新 更新表中的现有数据。 连接更新 根据另一个表中的值更新表中的值。 删除 删除表中的数据。
领取专属 10元无门槛券
手把手带您无忧上云