天道酬勤,学无止境

开窗函数的意义与用法

开窗函数——排序函数

开窗函数与其他函数的区别是,它不是关联其他表查询,而是在一张表内根据我们的想法自定义的规则分组后对我们组内的数据进行检索和计算。我们自定义的规则所分的组,就如同整张表的一个个小窗口,因此我们开出一个个小窗口并对这些小窗口进行的操作就叫做开窗函数。
开窗函数分为排序函数和聚合函数。

一、排序函数:

1.三个排序函数

句型:row_number()的排序函数

order_func OVER([PARTITION BY expression] ORDER BY clase)

其中,order_func是指排序函数,包括:
row_number(),rank(),dense_rank(),ntile();
他们会为每一行返回一个序值。
PARTITION BY 是我们自定义的分组策略,如果不用,该函数会把其余select 语句包括where、having、group by的运行结果做为窗口进行排序;ORDER BY 是排序的方法,即每个窗口内根据哪个字段排序,不能缺省
例如:我们需要对一个包含4个班级的16个同学的成绩表进行以班为单位的排序,我们可以这样排序:

select st_name
		,st_class
		,st_score
		,row_number() over(partition by st_class order by score)  as '名次'
from score_tab;

但有时候我们的业务需求我们排序,但不以表中的字段排。而我们又不能没有ORDER BY语句,我们应该怎么办呢?是的,开发者也考虑到了:

select st_name
		,st_class
		,st_score
		,row_number() over(partition by st_class order by (select 0))  as '名次'
from score_tab;

当然,这并不是所有sql家族成员都是这么设计的,比如hive的方法就略有不同:

select st_name
		,st_class
		,st_score
		,row_number() over(partition by st_class order by 0)  as '序值'
from score_tab;

直接用0,并不用select 0;
当然,这种排序也是有弊端的,就拿我们的学习成绩为例,假如同一个窗口内的两个同学分数相同,我们按这种方法排,可能他们一个是第二名,一个是第三名,这样对孩子就太不公平了。于是,我们又有了另外两种排序方式:
rank()和dense_rank()
三者的区别是:

row_number() 对窗口每一行记录输出一个序值,同一窗口不会有重复的充值,无论排序字段值是否相等,都是1,2,3,4;
rank() 对窗口内每一行记录输出一个序值,字段值相同的,则输出相同序值,下一充值为非密集排序,如1224;
dense_rank() 对窗口内每一行记录输出一个充值,字段值相同的,则输出相同序值,下一序值为密集排序,如:1,2,2,3;

2.数据均分分组函数–NTILE()

NTILE()的功能是进行均分分组,其参数是我们要分组的数量,比如,我们把学生平均分为四组,

select st_name,
		, st_class,
		,st_score
		,NTILE(4) OVER(ORDER BY st_score) as '分组'
from score_tab;

结果是按照成绩排列为1,2,3,4组,部分数据如下:

st_namest_classst_score分组
a1681
c4691
r3721
d4851

如果我们按班级为单位,把每一个班的成绩平均分为高、下两种评级,则:

select st_name,
		, st_class,
		,st_score
		,CASE NTILE(2) OVER(PARTITION BY st_class ORDER BY st_score) 
			when 1 then '低'
			when 1 then '高'
		END ASlevelfrom score_tab;
st_namest_classst_scorelevel
p469
g475
e487
j492

总结:

一般我们在使用排序函数的时候,我们不会同时使用distinct,因为我们在给记录进行排序时,一般会忽略同值记录,事实上我们执行如下语法,其中的distinct并没有起作用,不会去重,只是增加了资源的开销:

SELECT DISTINCT st_score
	,ROW_NUMBER() OVER(PARTITION BY st_class ORDER BY st_score) AS '排名'
FROM score_tab;

如果我们业务真实需要去重后再编序值,请用过滤条件GROUP BY,如:

SELECT st_score
	,ROW_NUMBER() OVER(PARTITION BY st_class ORDER BY st_score) AS '排名'
FROM score_tab
GROUP BY st_score;

相关:替代方案–子查询

在开窗函数没有发布之前,我们进行窗口操作都是使用子查询进行的,其原理为:先查出该组内比当前成绩低的个数,再加上1,就是该学生在该组的序值,如:

select st_name
		,st_class
		,st_score
		--开窗函数方式
		,row_number() over(partition by st_class order by score) as '开窗序值名次'
		--子查询
		(SELECT COUNT(1)+1 FORM st_score s2
		WHERE s2.st_class=a1.st_class AND s2.st_score<s1.st_score) as 子查询名次
from score_tab s1;

--如果是密集排序,我们只需把count()的参数改为排序字段即可去重,如
select st_name
		,st_class
		,st_score
		--开窗函数方式
		,row_number() over(partition by st_class order by score) as '开窗序值名次'
		--子查询
		(SELECT COUNT(st_score)+1 FORM st_score s2
		WHERE s2.st_class=a1.st_class AND s2.st_score<s1.st_score) as 子查询名次
from score_tab s1;

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 数据库刷题笔记1
    目录 简化等值查询mysql中limit和offset的用法LIMIT 分页查询In 与 exists 的区别IN 语句:只执行一次EXISTS语句:执行student.length次区别及应用场景not in 和not exists 日期函数格式转换开窗函数函数简介语法简介 聚合函数排名函数 简化等值查询 多表连接查询,且去掉重复列,使用 USING() select * from school left join course USING (courseid) #相当于 select * from school left join course on school.courseid=course.courseid; mysql中limit和offset的用法 mysql里分页一般用limit来实现,例如: 1、select* from user limit 3; 表示直接取前三条数据 2、select * from user limit 1,3; 表示取2,3,4三条条数据 3、select * from user limit 3 offset 1; 表示取2,3,4三条条数据 解释: 1、当 limit后面跟一个参数的时候,该参数表示要取的数据的数量 例如 select* from user limit 3; 表示直接取前三条数据 2、当limit后面跟两个参数的时候
  • ClickHouse 开窗函数(row_number()、rank()等)
    正宗的ClickHouse开窗函数来袭 在今年2月6号线上举行的 ClickHouse China Spring Meetup 中,朵夫为我们带来了 ClickHouse Features 2021 的分享,其中有非常多强大的新特性,幻灯片的下载地址如下: https://presentations.clickhouse.tech/meetup50/new_features/ 在众多的新特性中,我对开窗函数、自定义UDF、ZooKeeper优化等几项特别感兴趣,后续我也打算分别用几篇文章来展开说明。 现在 ClickHouse 提供了正宗的实现,功能上使用起来真是比先前的奇技淫巧简单太多了。 首先准备测试表: CREATE TABLE test_data engine = Memory AS WITH( SELECT ['A','A','A','A','B','B','B','B','B','A','59','90','80','80','65','75','78','88','99','70'])AS dict SELECT dict[number%10+1] AS id, dict[number+11] AS val FROM system.numbers LIMIT 10 在此之前,如果要实现 row_number 和 dense_rank 的分组查询
  • SQL开窗函数(窗口函数)详解
    一、什么是开窗函数 开窗函数/分析函数:over() 开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数。 开窗函数的调用格式为: 函数名(列名) OVER(partition by 列名 order by列名) 。 如果你没听说过开窗函数,看到上面开窗函数的调用方法,你可能还会有些疑惑。但只要你了解聚合函数,那么理解开窗函数就非常容易了。 我们知道聚合函数对一组值执行计算并返回单一的值,如sum(),count(),max(),min(), avg()等,这些函数常与group by子句连用。除了 COUNT 以外,聚合函数忽略空值。 但有时候一组数据只返回一组值是不能满足需求的,如我们经常想知道各个地区的前几名、各个班或各个学科的前几名。这时候需要每一组返回多个值。用开窗函数解决这类问题非常方便。 开窗函数和聚合函数的区别: (1)SQL 标准允许将所有聚合函数用作开窗函数,用OVER 关键字区分开窗函数和聚合函数。 (2)聚合函数每组只返回一个值,开窗函数每组可返回多个值。 开窗函数与聚合函数一样,也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计算的行集组是窗口。 注:常见主流数据库目前都支持开窗函数,但mysql数据库目前还不支持(8.0后已支持)。
  • MySQL基础(五)——MySQL中常用函数
    前言   上篇文章给大家介绍了多表连接查询以及嵌套查询,包括内连接和外连接,也介绍了子查询,包括in以及any等关键字的用法。最后分别通过案例对这部分知识点进行了讲解。本文给大家介绍MySQL中常用的一些函数,其中主要包括数学函数、字符串函数、日期时间函数、分组合并函数、逻辑函数以及开窗函数。不过开窗函数很重要,我们在下篇文章单独介绍。首先给大家介绍字符串函数。 一、字符串函数   我们首先通过一张表格来给大家介绍字符串函数的相关功能:   我们常用的字符串函数大概就这些。我们在本文中只介绍最常见的字符串函数,其他不常用的大家在工作中用到了可以去看看相关用法即可; 1、CONCAT(str1,str2,...)把多个文本字符串合并成一个长字符串;具体用法如下: select concat('我们','要', '好好学习');   执行的结果如下:   这里需要我们注意的是NULL值问题,任何字符串和NULL值连接均为NULL,具体如下: select concat('我们',NULL, '好好学习');   执行的结果如下: 2、INSTR(str,substr)返回子字符串substr在文本字符串str中第一次出现的位置(),具体用法如下: select instr('我们要学好MySQL', '学好');   执行的结果如下: 3、LEFT(str,len
  • mysql开窗函数有哪些_mysql开窗函数
    开窗函数: 它可以理解为记录集合,开窗函数也就是在满足某种条件的记录集合上执行的特殊函数。 对于每条记录都要在此窗口内执行函数,有的函数随着记录不同,窗口大小都是固定的,这种属于静态窗口; 有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。 开窗函数的本质还是聚合运算,只不过它更具灵活性,它对数据的每一行,都使用与该行相关的行进行计算并返回计算结果。 开窗函数和普通聚合函数的区别聚合函数是将多条记录聚合为一条;而开窗函数是每条记录都会执行,有几条记录执行完还是几条。 聚合函数也可以用于开窗函数中。 按照函数功能不同,MySQL支持的开窗函数分为如下几类: 序号函数:row_number() / rank() / dense_rank() 分布函数:percent_rank() / cume_dist() 前后函数:lag() / lead() 头尾函数:first_value() / last_value() 其他函数:nth_value() / nfile() 开窗函数的一个概念是当前行,当前行属于某个窗口,窗口由 over关键字用来指定函数执行的窗口范围,如果后面括号中什么都不写,则意味着窗口包含满足where条件的所有行,开窗函数基于所有行进行计算;如果不为空,则有三个参数来设置窗口: partition by子句:按照指定字段进行分区
  • mysql开窗函数排序_SQL Server进阶(八)查询——开窗函数、四大排名函数、透视数据、逆透视数据...
    概述 ROW_NUMBER() OVER(PARTITION BY CustId ORDER BY ID DESC) https://www.jb51.net/article/75533.htm 开窗函数 SELECTempid, ordermonth, val,SUM(val) OVER(PARTITION BYempidORDER BYordermonth ROWSBETWEENUNBOUNDED PRECEDINGAND CURRENT ROW) ASrunvalFROM Sales.EmpOrders; 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE) ROW_NUMBER()的用途的非常广泛,排序最好用他,一般可以用来实现web程序的分页,他会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。 rownum列就是row_number函数生成的序号列,其基本原理是先使用over子句中的排序语句对记录进行排序,然后按照这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同。 dense_rank函数的功能与rank函数类似,dense
  • 《起 航 之SQL技能全掌握》上
    目 录第一部分:SELECT 查询篇一. SELECT 基础查询1.1. SELECT 简介1.2. SQL99中 SELECT 的基本语法1.2.1. 语法介绍1.2.1.1. 完整的 SQL 语句1.2.1.2. ALL、DISTINCT、UNIQUE 的区别1.2.1.3. 表和列的别名1.2.1.4. 双引号的表名和列名1.2.1.5. 取 TOP-N 的方法1.2.1.6. ORDER BY 字句1.2.1.6.1. ORDER BY 时可以使用列名、列别名、列位置表示 1.2.1.6.2. 错误的 ORDER BY 语句1.2.1.6.3. 特殊的 ORDER BY 语句(DBMS_RANDOM随机函数) 1.2.1.6.4. ORDER BY 时 NULLS FIRST | NULLS LAST 1.2.1.7. GROUP BY 字句1.2.1.7.1. SELECT 中出现的非多行函数的所有列,必须出现在 GROUP BY 字句中 1.2.1.7.2. GROUP BY 字句中出现的所有列,可以出现在 SELECT 字句中 1.2.1.7.3. GROUP BY 中不能出现列的别名 1.2.1.7.4. WHERE 和 HAVING 的区别 1.2.1.8. SQL 的执行顺序1.2.1.9. ORDER BY、GROUP BY 和 DISTINCT 1.2.1
  • 开窗函数
    一、什么是开窗函数 开窗函数/分析函数:over() 开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数。 开窗函数的调用格式为: 函数名(列名) OVER(partition by 列名 order by列名) 。 如果你没听说过开窗函数,看到上面开窗函数的调用方法,你可能还会有些疑惑。但只要你了解聚合函数,那么理解开窗函数就非常容易了。 我们知道聚合函数对一组值执行计算并返回单一的值,如sum(),count(),max(),min(), avg()等,这些函数常与group by子句连用。除了 COUNT 以外,聚合函数忽略空值。 但有时候一组数据只返回一组值是不能满足需求的,如我们经常想知道各个地区的前几名、各个班或各个学科的前几名。这时候需要每一组返回多个值。用开窗函数解决这类问题非常方便。 开窗函数和聚合函数的区别如下: (1)SQL 标准允许将所有聚合函数用作开窗函数,用OVER 关键字区分开窗函数和聚合函数。 (2)聚合函数每组只返回一个值,开窗函数每组可返回多个值。 注:常见主流数据库目前都支持开窗函数,但mysql数据库目前还不支持。 二、常见面试题 1. 分区排序:row_number () over() 有如下学生成绩表:students_grades 查询每门课程course_name前三名的学生姓名及成绩,要求输出列格式如下:
  • SQL实用题型-用户最长连续登陆天数
    SQL-查询用户最长连续登陆天数 sql经典题型:求用户连续登陆的最长天数题目难点:如何求连续登陆的天数本题的思考 sql经典题型:求用户连续登陆的最长天数 已知:一个简单的用户登陆表: uiddatu12019/9/1u12019/9/2u12019/9/3u12019/9/8u12019/9/9u22019/9/2u22019/9/3 想要得到:查询结果如下 uidmax_dayu13u12u22 题目难点:如何求连续登陆的天数 首先想到的是用 COUNT + GROUP BY 的用法,那么GROUP BY后面用于分组的条件就是连续登陆的标记(分别为连续登陆2天,3天,6天,10 天等等)。如何对于每一个用户构建连续登陆的标记? 这个时候,很容易就会想到平时算法中的相邻循环加1,但是在SQL中一定要转变这种思维方式,而是思考能不能给这些连续加1的日期打上一个相同的标签,这样子就可以利用这个标签当作GROUP BY分组的条件了。以用户U1为例,该用户有两次连续登陆的经历,第一次是连续3天,第二次是连续2天,我们只要能对这两次的连续登陆行为打上两个标签,则可以使用GROUP BY对于不同标签组内的数据进行COUNT的计算,从而得到用户的连续登陆天数这一新变量。以用户U1连续登陆3天的3个数据为例,怎么给着三个数据打上同样的标签呢?此时我们思考,这三个数据DATE1,DATE2
  • hive的开窗函数举例(SUM、AVG、MIN、MAX)
    数据准备: cookie1,2015-04-10,1 cookie1,2015-04-11,5 cookie1,2015-04-12,7 cookie1,2015-04-13,3 cookie1,2015-04-14,2 cookie1,2015-04-15,4 cookie1,2015-04-16,4 建表语句: create database if not exists myhive; use myhive; drop table if exists cookie; create table cookie(cookieid string, createtime string, pv int) row format delimited fields terminated by ','; load data local inpath "/home/hadoop/cookie.txt" into table cookie; select * from cookie; desc cookie; 1.SQL语句: SUM SELECT cookieid,createtime,pv, SUM(pv) OVER (PARTITION BY cookieid ORDER BY createtime) AS pv1, -- 默认为从起点到当前行 SUM(pv) OVER(PARTITION BY
  • 计算机三级——数据库技术
    计算机三级——数据库技术 一、考试内容及要求 掌握数据库技术 的基本概念、原理、方法和技术。能够使用SQL语言实现数据库的基本操作(增删改查)基本数据库系统安装配置以及数据库管理及维护的基本技能。掌握数据库管理和维护的方法。掌握数据库性能优化的方法。了解数据库系统的生命周期及设计和开发过程。了解常用的数据库管理和开发工具,具备用指定的工具管理开发简单数据库应用系统的能力。了解数据库的最新发展。 二、考试题型 选择题——30小题(40分);应用题(填空题)——10小题(30分);设计与应用题——三大题(30分)。画E-R图(考试带有工具 ),范式,SQL语句 三、考试环境 1.软件:SQL service 2008 2.只需在正确答案的前面选中即可(都为单选题) ,在应用题中一空可能会有多个答案选项,在填写答案时要全部写上且要用顿号(、)隔开 3.考试时间为120分钟(上机考试 ),考试结束前5分钟系统会报警提醒考生存盘,考试时间为0自动交卷。 第一章 数据库应用系统开发方法 ①掌握数据库的基本概念。 ②了解软件工程和数据库技术 ③理解DBAS生命周期模型 第一节 基本概念 1.数据 1)数据:是数据库中存储的基本对象。 ​ 定义:描述事物的符号序列。 ​ 数据的种类:数字、文字、图形、图像声音以及其他特殊符号。 2)计算机中的数据分为两个部分:①临时性数据(程序运行时产生的数据
  • 【DB笔试面试460】在Oracle中,有哪些常用的分析函数?
    ♣ 题目 部分 在Oracle中,有哪些常用的分析函数? ♣ 答案部分 分析函数是Oracle从8.1.6开始引入的一个新的概念,为分析数据提供了一种简单高效的处理方式。在分析函数出现以前,实现相同的功能必须使用自联查询、子查询或者内联视图,甚至需要复杂的存储过程来实现。有了分析函数后,只要一条简单的SQL语句就可以实现了,而且在执行效率方面也有相当大的提高。Oracle的分析函数主要用于报表开发和数据仓库。分析函数的功能强大,可以用于SQL语句的优化,在某些情况下,能达到事半功倍的效果。分析函数的一般格式是:函数名(参数列表) OVER ([PARTITION BY 字段名或表达式] [ORDER BY 字段名或表达式]),其中OVER()部分称为开窗函数,它是可以选填的。开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化。分析函数的写法比较复杂,下面将讲解几个常用的分析函数。(一)RANK()分析函数该函数的作用是根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。该函数的结果是不连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4。例子:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号SYS@lhrdb> SELECT d.department_id, 2 e
  • 2020.11.23(spark-sql、复杂SQL、函数、自定义函数)
    写SQL的时候都会遇到一个东西,函数。尤其写SQL的时候有两类场景,OLTP和OLAP,OLTP的时候也会写函数,但是多数情况属于时间函数、日期函数、金额函数,OLTP就是平常CRUD的时候,对着数据库发起的快速的,返回结果的。OLAP趋向于分析型的,时间粒度,OLAP会比OLTP复杂度高一点,分析的时候会卡在对数据,不是简单的一个单元格的值的修正,可能要做很多分组的值的转换,关联的操作,OLTP真正实操的时候也会将表里的东西转成视图,尽量做一些视图的物化等等。来缩减OLTP有可能做数据关联的时间复杂度。 OLAP在大数据里是经常会出现的。所以这里面函数是一个非常重要的知识点,每每说到函数,函数的分类有哪些?有3个维度。 偏向业务数据处理的:时间函数,字符串函数,日期函数,数学函数等等常规函数。 从另外一个维度来分,函数分为聚合函数,窗口函数(分成多少个分区然后做些事情),业务函数,还有一些关键的技能点,比如有一些转换的case when等等的。这是一个维度。 再从另外一个维度:系统提供的函数,用户自定义的函数。 基本数系统都会提供大量的函数,这些函数在哪? hive也有一套函数,spark的函数基本上与它是兼容的。 org.apache.spark.sql.functions 未来工作的话应该知道spark的函数都有哪些,去哪里看。所有的函数都在这里出现了。除了它
  • Mysql——聚合、开窗函数
    --聚合函数 --sum,avg,count,max,min select * from Student select count(*) from Student--就是计数的 where Sage=19 --null不做计数 select min(Sage) from Student select avg(Grade) from Student inner join Sc on Student.Sno=Sc.Sno where Sname='李勇'--计算李勇成绩的平均分 --开窗函数over --结合聚合函数,排名函数,将统计信息分布到行中 select Sc.*,avg(Grade) over() from Sc --统计男女生人数 select Ssex,Sage,count(*) from Student group by Ssex,Sage--其实就是加入了一个分组的功能 order by Sage 来源:https://blog.csdn.net/Aa13527916708/article/details/102649018
  • python随笔-函数与调用函数
    一.capitalize将字符串首字母大写,其余字符都变成小写。(只能使用字符串变量或者直接使用字符串才能使用。)用法:新的变量=需要处理的字符串.capitaliza() {()是表述执行的意思 ()里面是空的表示这个这个函数不需要填写参数。}示例:a='abcdef'#赋予值 b='aBCDEF'#赋予值 a_a=a.capitalize()#新的变量 b_b=b.capitalize()#新的变量 c='abCDef'.capitalize()#新的变量 print(a_a,type(a_a),a,type(a))#打印函数效果,打印类型,打印原变量,打印原变量类型 print(b_b,type(b_b),b,type(b))#打印函数效果,打印类型,打印原变量,打印原变量类型 print(c,type(c),c,type(c))#打印函数效果,打印类型,打印原变量,打印原变量类型 Abcdef abcdef Abcdef aBCDEF Abcdef Abcdef二.casefold 将字符串全体小写(只对字符串中的字母有效,可以对多种语言进行小写)用法:新的变量=需要处理的字符串.casefold() {()是表述执行的意思,并且 ()里面是空的表示这个这个函数不需要填写参数。}三.lower 将字符串全体小写(只对字符串中的字母有效,只能对英语进行小写)用法:新的变量
  • Hive中的开窗操作over()
    前提 over() 可以为 聚合函数,窗口函数和分析函数进行开窗操作; 开窗之后,每一行的数据都会对应一个数据窗口,这个数据窗口中的数据可能会随着行的变化而变化。 over(参数) 中可以指定的参数 over() 开窗开出来的数据是整个查询结果排除开窗操作,都执行完之后的数据。也可以说是开窗操作是在整个select查询结束后才执行的,因此开窗出来的数据也是在当前select的查询结果上进行划分的。 over中可以指定的参数(官方定义: WINDOW specification): (ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING) (ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING) (ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING rows 限定的是行所在的范围,range限定的是某一列的值所在的范围 partition by col:按照col进行分区(类似于分组)
  • mysql窗口函数(分析函数)知识笔记
    窗口函数 MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数。开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据返回一条结果。开窗函数也是通过指定字段将数据分成多份,也就是多个窗口,对每个窗口的每一行执行函数,每个窗口返回等行数的结果。窗口函数分为静态窗口和滑动窗口,静态窗口的大小是固定的,滑动窗口的大小可以根据设置进行变化,在当前窗口下生成子窗口。 1、窗口函数的定义 窗口函数作用于一个数据集合。窗口函数的一个概念就是当前行,当前行属于某个窗口就是从整个数据集选取一部分数据进行聚合/排名等操作。 2、窗口函数的语法 语法:函数名([参数]) over(partition by [分组字段] order by [排序字段] asc/desc rows/range between 起始位置 and 结束位置) 函数解读:函数分为两个部分,第一部分是函数名称,开窗函数的数量较少,只有11个窗口函数+聚合函数(所有聚合函数都可以用作开窗函数),根据函数性质,有的要写参数,有的不需要写参数; 第二部分是over语句,over()是必须要写的,里面有三个参数,都是非必须参数,根据需求选写: 1.第一个参数是 partition by +分组字段,将数据根据此字段分成多份,如果不加partition by参数
  • 变量的三种命名方法
    1、引言 随着计算机技术的不断发展,计算机计算能力的提升催生了大量大型软件的出现,大型软件的代码量动辄成千上万行,甚至数十万行。随着代码量的指数级增长,以前未曾注意的“小”问题也明显被放大。比如代码中的变量命名,这属于我们印象中的“小”问题,对于代码量小的程序来说,将变量命名为a、b、aa、string1、string2等类型,并不会影响程序的编写及阅读,如果是代码量大的程序,如果通篇都是字母、*1、*2等类型的变量名称,不仅在编写代码时容易出错,而且极不利于程序的阅读,那程序的后期维护就更难上加难了!所以如何有效地解决这些“小”问题也成了亟需研究的内容。 本文主要研究的是在代码编写时的变量、函数命名法。目前存在的主流命名法主要有匈牙利命名法、骆驼命名法、帕斯卡命名法。下面就对这三种命名法进行详细的介绍,并结合三种命名法的特点提出适合自己的命名规则。 2、匈牙利命名法 2.1、简介 匈牙利命名法(Hungarian Notation),是由1972年至1981年在施乐公司工作的程序员查尔斯.西蒙尼(Charles.Simony),此人后来成为微软的总设计师,因其祖籍是匈牙利,故有此名。 匈牙利命名法在国内之所以这么有名是因为当时微软对其推崇备至。在上世纪90年代,MFC的出现影响了一代代程序员,而MFC中各种类的命名是以匈牙利命名法命名的,再加上当时微软出了不错的¹
  • 2020软件测试学习路线图,内附视频教程+自学路线+工具+面试篇 (持更中。。。。)
    一、软件测试学习路线图—流程篇: 下图如觉不清楚,请狠狠点击图片查看清晰版 软件测试视频第一阶段-前置基础知识 1、学习目标: 可掌握的核心能力: 熟悉计算机相关概念; 掌握基础的测试理论; 熟练掌握HTML常用标签和语法规范; 掌握使用CSS定义网页样式; 掌握js的基本用法; 2、知识点: 1)计算机基础 计算机组成部分、操作系统分类、B/S和C/S架构、常用DOS命令、服务器域名 2)测试理论 软件测试的目的、软件测试定义、软件测试原则、产品质量模型、测试基本流程 3)HTML基础 HTML基础语法、标签属性、图片标签、超链接、锚点、表单 4)CSS基础 CSS基础语法、CSS四类选择器、常用文字属性、行高属性、边框、盒子模型、内外边距 5)JS基础 JS基础语法、JS引入方式 第二阶段-linux和数据库 1、学习目标: 可掌握的核心能力: 掌握Linux操作系统按照和配置; 熟练掌握Linux常用命令; 掌握数据库增删改查操作; 熟悉数据库索引、视图、事务、常见函数等高级功能; 掌握Redis的string类型、hash类型、set类型、list类型等基本类型和操作; 2、知识点: 1)LINUX(熟悉) 操作系统介绍、操作系统发展历史、CentOS图形界面、文件和目录、常用LINUX命令使用、vim文本编辑器的使用 2)数据库介绍(熟悉) 数据库基本概念
  • Java技术分享:void的用法和意义
    本文由小千分享void的用法和意义,void在Java中一般用来表示方法没有返回值。例如: 那么其底层原理到底如何呢?我们来一点点的分析一下。 先来了解一下这个单词的基本含义,根据网络查询结果,如下: 说明void这个单词本身的含义就是空白,空的。在Java语言中,一般也用void这个关键字作为方法的返回值,表示该返回值为空。当定义一个方法没有返回值的时候,就可以使用该关键字,如果在代码中需要返回,可以使用return关键字,例如: 实际上,在Java中,有一个类java.lang.Void对应着void关键字,如下: 从上面的源代码来看,Void其实就是void的封装类型,一般被称为占位符(placeholder)。这里看起来好像有点类似于Integer跟int的关系,但其实并不是这样,Void比较特别:首先它不能实例化;其次它也没有内置的实例,也没有可以用的字面值。 所以声明一个Void变量通常是没有意义的,因为没有可以赋值的实例。所以Void变量唯一能赋值的就null。 Void唯一一个可用的地方就是用来判断反射时的类型。例如: 但是这里也可以使用void.class来替代。所以Void其实就是void的封装。 那么既然void就是表示没有返回值,为什么不能直接不写呢?一定需要一个void占位符呢?我们去研究一下Java的底层,也就是C/C++语言。在C/C++中