天道酬勤,学无止境

异或运算与rank() over,dense_rank() over和row_number() over区别

首先说一下十进制和二进制之间是怎么转换的
以正整数转换二进制为例:
将正的十进制数除以二,得到的商再除以二,依次类推直到商为0或1时为止,然后在旁边标出各步的余数,最后倒着写出来,高位补零,如下:
在这里插入图片描述
42的二进制数是101010
再把这个二进制转换成十进制怎么转换呢?
如下,我们把每一位对应2的nc次方
在这里插入图片描述
在这里插入图片描述
如上即可转换为十进制42
好了知道如上的转换,我们还需要知道一点就是
^表示的是异或运算----异或运算的规则是,同位如果不同则为1,相同为0
比如:
0的二进制是00,1的二进制为01,0^1,得到二进制数01,即1,
1的二进制是01,1的二进制为01,1^1,得到二进制数00,即0,
2的二进制是10,1的二进制为01,2^1,得到二进制数11,即3,
同理
3的二进制是11,1的二进制为01,3^1,得到二进制数10,即2,
4的二进制是100,1的二进制为001,4^1,得到二进制数101,即5,
5的二进制是101,1的二进制为001,5^1,得到二进制数100,即4,
6的二进制是110,1的二进制为001,6^1,得到二进制数111,即7,
因此从0开始的自然数与1进行异或运算能够得到相邻奇偶数的互换。

再介绍一个概念:

#rank() over:查出指定条件后的进行排名,使用这个函数,成绩相同的两名是并列,下一位同学空出所占的名次
#dense_rank() over:两名学生的成绩并列以后,下一位同学并不空出所占的名次
#row_number() over:这个函数不需要考虑是否并列,哪怕根据条件查询出来的数值相同也会进行连续排名
**

1、如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
| Id | Score |
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
| Score | Rank |
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
我们可以使用dense_rank() over这样:
select Score, dense_rank() over(order by Score desc) ‘Rank’ from Scores;

2、相等后如果名次不连续呢?
| Score | Rank |
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 3 |
| 3.65 | 4 |
| 3.65 | 4 |
| 3.50 | 6 |
select Score, rank() over(order by Score desc) ‘Rank’ from Scores;

3、不管分数是否相同,直接排名次
| Score | Rank |
| 4.00 | 1 |
| 4.00 | 2 |
| 3.85 | 3 |
| 3.65 | 4 |
| 3.65 | 5 |
| 3.50 | 6 |

我们可以这样写:
select Score, row_number() over(order by Score desc) ‘Rank’ from Scores;

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • oracle中的RANK()和DENSE_RANK()函数有什么区别?(What's the difference between RANK() and DENSE_RANK() functions in oracle?)
    问题 RANK()和DENSE_RANK()函数之间有什么区别? 如何在下面的emptbl表中找出第n个薪水? DEPTNO EMPNAME SAL ------------------------------ 10 rrr 10000.00 11 nnn 20000.00 11 mmm 5000.00 12 kkk 30000.00 10 fff 40000.00 10 ddd 40000.00 10 bbb 50000.00 10 ccc 50000.00 如果表中的数据为nulls ,如果我想找出nth薪水会怎样? 回答1 RANK为您提供有序分区内的排名。 领带被分配相同的等级,而下一个等级被跳过。 因此,如果您在第2级有3个项目,则列出的下一个级别将是第5级。 DENSE_RANK再次为您提供了有序分区中的排名,但是这些排名是连续的。 如果存在包含多个项目的等级,则不会跳过任何等级。 至于空值,则取决于ORDER BY子句。 这是一个简单的测试脚本,您可以使用它来查看会发生什么: with q as ( select 10 deptno, 'rrr' empname, 10000.00 sal from dual union all select 11, 'nnn', 20000.00 from dual union all select 11, 'mmm', 5000
  • MySQL实现排名/分组排名/合计(8.0窗口函数rank/dense_rank、5.6/5.7自行模拟)
    读完本文,您将掌握: MySQL查询时直接显示排名/分组排名/分组合计的方法,支持5.6/5.7/8.0版本MySQL 8.0中rank()和dense_rank()的用法与区别MySQL 8.0的window窗口函数用法MySQL 变量的一些用法 更多MySQL函数介绍,可查看《MySQL函数和运算符》 目录 目标效果实现方案MySQL 8.0全局排名分组排名合计小结 MySQL 5.6/5.7全局排名分组排名合计 总结 目标效果 模拟数据如下: DROP TABLE IF EXISTS `test_sum`; CREATE TABLE `test_sum` ( `year` SMALLINT NOT NULL, `province` VARCHAR(32) NOT NULL, `num` INT UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `test_sum` (`year`,`province`,`num`) VALUES (2018,'北京',1), (2018,'上海',3), (2018,'浙江',7), (2019,'北京',5), (2019,'上海',5), (2019,'浙江',11); 目标实现三个场景:
  • spark中密集等级和行号的差异(Difference in dense rank and row number in spark)
    问题 我试图了解密集排名和行号之间的区别。每个新窗口分区都从 1 开始。行的排名不总是从 1 开始吗? 任何帮助,将不胜感激 回答1 不同之处在于排序列中有“关系”时。 检查下面的例子: import org.apache.spark.sql.expressions.Window import org.apache.spark.sql.functions._ val df = Seq(("a", 10), ("a", 10), ("a", 20)).toDF("col1", "col2") val windowSpec = Window.partitionBy("col1").orderBy("col2") df .withColumn("rank", rank().over(windowSpec)) .withColumn("dense_rank", dense_rank().over(windowSpec)) .withColumn("row_number", row_number().over(windowSpec)).show +----+----+----+----------+----------+ |col1|col2|rank|dense_rank|row_number| +----+----+----+----------+----------+ | a| 10|
  • SQL RANK()与ROW_NUMBER()(SQL RANK() versus ROW_NUMBER())
    问题 我对两者之间的差异感到困惑。 运行以下SQL将为我提供两个重要的结果集。 有人可以解释这些差异吗? SELECT ID, [Description], RANK() OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank' FROM SubStyle SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle 回答1 ROW_NUMBER:为从1开始的每一行返回一个唯一的数字。对于具有重复值的行,数字是任意分配的。 等级:为每行从1开始分配一个唯一的数字(具有重复值的行除外),在这种情况下,将分配相同的等级,并且在每个重复等级的序列中会出现一个间隔。 回答2 仅当您在分区中具有特定订购值的联系时,您才会看到差异。 在这种情况下, RANK和DENSE_RANK是确定性的,对于排序和分区列具有相同值的所有行最终都将得到相等的结果,而ROW_NUMBER将任意(非确定性)将递增结果分配给绑定的行。 示例:(所有行都具有相同的StyleID因此它们位于同一分区中,并且在该分区中,按照ID排序时,前3行被捆绑在一起) WITH T(StyleID, ID) AS (SELECT 1,1
  • SQLzoo刷题-窗口函数
    一、排名函数 ROW_NUMBER() 将select查询到的数据进行排序,每一条数据加一个序号 SELECT ROW_NUMBER() OVER(ORDER BY 字段) RANK() 对某一个字段进行排名与ROW_NUMBER()的区别: ①ROW_NUMBER()是排序函数,1,2,3,4,5,6,… ②RANK()是排名函数,当某个字段的存在两个值相等时,会并列排名 SELECT RANK() OVER(ORDER BY 字段) DENSE_RANK() 是密集的排名函数与RANK()的区别: ①DENSE_RANK(),处理相同的值时,排名:1,1,2(而不是1,1,3) ②RANK(),处理相同的值时,排名:1,1,3(跳过排名2) SELECT DENSE_RANK() OVER(ORDER BY 字段) 参考链接:https://blog.csdn.net/shaiguchun9503/article/details/82349050 二、分区函数 Partition By Partition By是分区函数与GROUP BY的区别:Partition By统计的每一条记录都存在,而GROUP BY将所有的记录汇总成一条记录 RANK() OVER (PARTITION BY 字段1 ORDER BY 字段2 DESC) /*表示先按字段1分区
  • mysql8.0新特性 之 窗口函数 使用示例及详解
    什么是窗口函数 MySQL从8.0开始支持窗口函数,这个功能在大多数据库中早已支持,有的也叫分析函数。 窗口的概念非常重要,它可以理解为记录集合,窗口函数也就是在满足某种条件的记录集合上执行的特殊函数对于每条记录都要在此窗口内执行函数,有的函数随着记录不同,窗口大小都是固定的,这种属于静态窗口;有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。简单的说窗口函数就是对于查询的每一行,都使用与该行相关的行进行计算。 窗口函数和普通聚合函数很容易混淆,二者区别如下: - 聚合函数是将多条记录聚合为一条;而窗口函数是每条记录都会执行,有几条记录执行完还是几条。 - 聚合函数也可以用于窗口函数中。 窗口函数功能 名称描述ROW_NUMBER()为分区中的每一行分配一个顺序整数【没有重复值的排序(记录相等也是不重复的),可以进行分页使用】RANK()与DENSE_RANK()函数相似,不同之处在于当两行或更多行具有相同的等级时,等级值序列中存在间隙【跳跃排序】DENSE_RANK()根据该ORDER BY子句为分区中的每一行分配一个等级。它将相同的等级分配给具有相等值的行。如果两行或更多行具有相同的排名,则排名值序列中将没有间隙【连续排序】PERCENT_RANK()计算分区或结果集中行的百分数等级CUME_DIST()计算一组值中一个值的累积分布LAG(
  • SQL Sever中的窗口函数row_number()rank()dense_rank()
    三个排序函数row_number()rank()dense_rank() 对于row_number()函数,他可以为表排序并返回一个序号 create table score (学号 nvarchar(10) not null, 课程 nvarchar(10) not null, 成绩 nvarchar(10) not null) insert into score values('01','语文',90), ('01','数学',67), ('02','语文',82), ('02','数学',78), ('03','语文',65), ('03','数学',98), ('04','语文',82), ('04','数学',98) 比如最简单的给这个表排序,比如根据学号倒序 select *,row_number()over(order by 学号 desc) 序号 from score 如图,row_number()over(order by 字段),则会根据你需要的字段进行排序,并给每一行一个编号,但是这些编号是连续的,比如学号为4号的有两行,但是row_number()函数并没有给他们相同的序号也就是排名,也就是说利用这个函数排序不存在相同名次的情况。如果数据的值相同,则先出现的数据排名更靠前。 row_number()函数也能分组进行排序,比如我想知道每门课程的排名情况。
  • SQL开窗函数(窗口函数)详解
    一、什么是开窗函数 开窗函数/分析函数:over() 开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数。 开窗函数的调用格式为: 函数名(列名) OVER(partition by 列名 order by列名) 。 如果你没听说过开窗函数,看到上面开窗函数的调用方法,你可能还会有些疑惑。但只要你了解聚合函数,那么理解开窗函数就非常容易了。 我们知道聚合函数对一组值执行计算并返回单一的值,如sum(),count(),max(),min(), avg()等,这些函数常与group by子句连用。除了 COUNT 以外,聚合函数忽略空值。 但有时候一组数据只返回一组值是不能满足需求的,如我们经常想知道各个地区的前几名、各个班或各个学科的前几名。这时候需要每一组返回多个值。用开窗函数解决这类问题非常方便。 开窗函数和聚合函数的区别: (1)SQL 标准允许将所有聚合函数用作开窗函数,用OVER 关键字区分开窗函数和聚合函数。 (2)聚合函数每组只返回一个值,开窗函数每组可返回多个值。 开窗函数与聚合函数一样,也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计算的行集组是窗口。 注:常见主流数据库目前都支持开窗函数,但mysql数据库目前还不支持(8.0后已支持)。
  • oracle中(ROW_NUMBER、RANK、DENSE_RANK)三大排序函数的区别
    最近同学面试找工作,面试官问到了(ROW_NUMBER、RANK、DENSE_RANK)这三大排名函数的区别,他说他确实用过,但是真要说区别,还真不清楚,那么今天就简单聊聊这三大函数的区别,网上也有很多人分享过,但是感觉太复杂了,我尽量做到简单。 第一步:建表。(表结构说明:某个班级中男生女生某一科成绩汇总)。 第二步:验证这三者的区别。 先贴出下面这段SQL,该SQL查询目的:“对班级同学以性别分组后,按成绩的升序排序” SELECT t.sex, t.score , ROW_NUMBER() OVER (PARTITION BY t.sex ORDER BY t.score asc) ROW_NUM, rank() OVER (PARTITION BY t.sex ORDER BY t.score asc) RANK, DENSE_RANK() OVER (PARTITION BY t.sex ORDER BY t.score asc) DENSE_RANK FROM TEST T 由上图女生对应成绩抽出的数据我们不难看出 row_number():不考虑数据的重复性 相同的数据排序番号也不同。 ①: 1,2,3,4,5,6(尽管有两个87,但是对应的序号不同) rank() :考虑数据的重复性,但是会挤占下一个数值的位置 ②:1,2,2,4,4,6(例如:两个87的序号都是2
  • sql查询与Row_Number不同(sql query distinct with Row_Number)
    问题 我正在与sql的distinct关键字作斗争。 我只想在列中显示唯一( distinct )值的所有行号,所以我尝试了: SELECT distinct id, ROW_NUMBER() OVER (ORDER BY id) AS RowNum FROM table where fid = 64 但是下面的代码给了我distinct价值: SELECT distinct id FROM table where fid = 64 但是当用Row_Number尝试时。 那就行不通了。 回答1 用这个: SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS RowNum FROM (SELECT DISTINCT id FROM table WHERE fid = 64) Base 并将查询的“输出”作为另一个查询的“输入”。 使用CTE: ; WITH Base AS ( SELECT DISTINCT id FROM table WHERE fid = 64 ) SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS RowNum FROM Base 这两个查询应该是等效的。 从技术上讲,您可以 SELECT DISTINCT id, ROW_NUMBER() OVER (PARTITION BY id
  • 第6章 高级数据查询
    6.1般数据査询功能扩展 6.1.1使用TOP限制结果集 当使用 SELECT 语句进行查询时,使用 TOP 谓词来限制输出的结果。使用 TOP 谓词的语法格式为: TOP n [percent][WITHTIES]——其中,n 为非负整数。 ①TOP n 取查询结果的前 n 行数据; ②TOP n percent:取查询结果的前 n%行数据; ③WITHTIES:表示包括最后一行取值并列的结果。 TOP 谓词写在 SELECT 单词的后边(如果有 DISTINCT 的话,则 TOP 写在 DISTINCT 的后边)、查询列表的前边。 【例 1】查询单价最高的前三种商品的商品名、商品类别和单价,包括并列的情况。 SELECT TOP3 WITHTIES GoodsName,GoodsClassName,SaleUnitPrice FROM Table_Goods a JOINTable_GoodsClass b ON a.GoodsClassID=b.GoodsClassID ORDERBY SaleUnitPrice DESC 注意:在使用 TOP 谓词时,应该与 ORDERBY 子句一起使用,这样的前几名才有意义。当使用 WITHTIES选项时,则要求必须使用 ORDERBY 子句。 6.1.2使用CASE函数 可以在查询语句中使用CASE函数
  • Oracle分析函数
    分析函数概述 和聚合函数相似,但是对于每一组记录,无论多少行,聚合函数只返回一行值,而分析函数对其中每一行记录都返回值这一组记录,称为分析函数的一个窗口(WINDOW)由窗口决定了要处理数据的范围,该范围在物理上可以由指定的行数来确定,或者在逻辑上由相对偏移量来确定分析函数总是在除了ORDER BY之外的其他子句运算后才执行的,所以它不能出现在 where、group by等子句中,只能出现在select列表和order by子句中 分析函数功能 排名 相邻 统计 分析函数功能--排名 几种不同的排名需求   – 排名无并列,且每个排名与紧接着的下一个排名都是连续的   – 排名有并列,且并列的排名与紧接着的下一个排名不连续   – 排名有并列,且并列的排名与紧接着的下一个排名连续   – 如下例,对CNT列排序的结果,从左到右分别符合上述三种需求,结果即为:     – 对cnt列的不同排名,sql如何写?with t as (select rownum*10 cnt from dual connect by rownum<5 union all select rownum*4010 from dual connect by rownum<3) select cnt, row_number()over(order by cnt) rn, rank()over(order by
  • 数据库刷题笔记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后面跟两个参数的时候
  • 如何在数据库Oracle中选择工资第二高的记录?(How can I select the record with the 2nd highest salary in database Oracle?)
    问题 假设我有一个带有 id、user_name、salary 的员工表。 如何在Oracle中选择工资第二高的记录? 我用谷歌搜索,找到这个解决方案,以下是正确的吗?: select sal from (select rownum n,a.* from ( select distinct sal from emp order by sal desc) a) where n = 2; 回答1 已经建议了 RANK 和 DENSE_RANK - 根据您的要求,您还可以考虑 ROW_NUMBER(): select * from ( select e.*, row_number() over (order by sal desc) rn from emp e ) where rn = 2; RANK()、DENSE_RANK() 和 ROW_NUMBER() 之间的区别归结为: ROW_NUMBER() 始终生成唯一的排名; 如果 ORDER BY 子句不能区分两行,它仍然会给它们不同的排名(随机) RANK() 和 DENSE_RANK() 将对 ORDER BY 子句无法区分的行给出相同的排名 DENSE_RANK() 将始终生成连续的排名序列 (1,2,3,...),而 RANK() 将在具有相同排名的两行或更多行后留下空白(想想“奥运会”:如果两名运动员获胜金牌,没有第二名
  • hive 开窗函数over()以及常用分析函数
    开窗函数over()是将聚合函数以列的形式展开,替代需要join聚合结果的处理 数据: CREATE TABLE `test`( `id` int, `class` string, `name` string, `score` int); insert into test values (1,'a','zhang',90), (2,'a','li',80), (3,'a','zhao',95), (4,'a','qian',85), (5,'a','sun',60), (6,'a','zhou',70), (7,'b','wu',75), (8,'b','zheng',50), (9,'b','wang',65), (10,'b','luo',100); 1 over() 如果要查询每个人的成绩与总成绩一个视图展示,通过join: select a.name,a.score,b.total_score from test a join (select sum(score)as total_score from test )b; 此时使用开窗函数就会更简单: select name,score,sum(score)over() as total_score from test; sum(score)over() total_score作用是将sum(score)作为值
  • mysql窗口函数分组排序_SQL:窗口函数处理分组与排序问题
    一.窗口函数应用场景: 在日常工作中,经常遇到需要分部门排序的问题。比如: 排名问题:每部门按照业绩排名; topN问题:找出每部门排名前N的员工。 当我们不了解“窗口函数”神奇的存在时,我们使用“晦涩难懂”的自连接SQL解决该问题。而窗口函数的存在为我们解决问题提供了方便。 二.窗口函数简介: MySQL从8.0开始支持窗口函数(OLAP函数),该功能在多数商业数据库和部分开源数据库中早已支持,用于快速解决SQL数据库多维分析处理问题。 窗口函数的基本语法如下: over ( partition by order by ) 初学者经常混淆窗口函数与普通聚合函数的关系,二者区别如下: 聚合函数:将多条记录聚合为一条,窗口函数:每条记录都会执行,有几条记录执行完还是几条; 聚合函数可以用于窗口函数中。 三.窗口函数的使用: 窗口函数种类繁多,我们这里只介绍序号函数——row_number( )/rank( )/dense_rank( )。 三者区别如下图所示: 四.窗口函数的例子: 我们以leetcode面试题为例: 这是一道经典的topN问题,涉及先分组再排序,并且属于dense_rank( )问题。 面对这种问题,解题步骤如下: 按给定列名分组(partiotion by 分组列名),并按给定列名排序(order by 排序列名),套入dense_rank窗口函数: select
  • 如何在SQL Server中使用RANK()(How to use RANK() in SQL Server)
    问题 我在SQL Server中使用RANK()有问题。 这是我的代码: SELECT contendernum, totals, RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank FROM ( SELECT ContenderNum, SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals FROM Cat1GroupImpersonation GROUP BY ContenderNum ) AS a 该查询的结果是: contendernum totals xRank 1 196 1 2 181 1 3 192 1 4 181 1 5 179 1 我想要的结果是: contendernum totals xRank 1 196 1 2 181 3 3 192 2 4 181 3 5 179 4 我想根据totals对结果进行排名。 如果有类似181值,则两个数字将具有相同的xRank 。 回答1 改变: RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank 到: RANK() OVER (ORDER BY totals DESC) AS xRank
  • MySQL8.0 窗口函数
    什么叫窗口? 窗口的概念非常重要,它可以理解为记录集合,窗口函数也就是在满足某种条件的记录集合上执行的特殊函数。对于每条记录都要在此窗口内执行函数,有的函数随着记录不同,窗口大小都是固定的,这种属于静态窗口;有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。 窗口函数和普通聚合函数也很容易混淆,二者区别如下: 聚合函数是将多条记录聚合为一条;而窗口函数是每条记录都会执行,有几条记录执行完还是几条。聚合函数也可以用于窗口函数中。 窗口函数语法 window_spec: [window_name] [partition_clause] [order_clause] [frame_clause] window_name:对于多个OVER子句定义指定一个别名,如果SQL中涉及的窗口较多,采用别名可以看起来更清晰易读。partition_clause:指示如何将查询行划分为组。给定行的窗口函数结果基于包含该行的分区的行。order_clause:ORDER BY子句指示如何对每个分区中的行进行排序。frame_clause:frame子句指定如何定义这个子集,在分区里面再进一步细分窗口,子句用来定义子集的规则,通常用来作为滑动窗口使用。详细内容参考:https://dev.mysql.com/doc/refman/8.0/en/window-functions
  • 开窗函数的意义与用法
    开窗函数——排序函数 开窗函数与其他函数的区别是,它不是关联其他表查询,而是在一张表内根据我们的想法自定义的规则分组后对我们组内的数据进行检索和计算。我们自定义的规则所分的组,就如同整张表的一个个小窗口,因此我们开出一个个小窗口并对这些小窗口进行的操作就叫做开窗函数。 开窗函数分为排序函数和聚合函数。 一、排序函数: 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
  • MySQL学习笔记六:表的运算和联结、窗口函数与grouping
    表的运算 新建立的product2表格如下: 对记录取并集,在两个select语句之间用union连接,如果想包含重复行就用union all连接。注意连接的两个表要列数相同、类型一致,且order by只能在末尾用一次。取交集在mysql中可以使用关联子查询: -- 取并集union(行方向) select product_id,product_name from product union select product_id,product_name from product2; -- 输出10个不同的商品记录 select product_id,product_name from product union all select product_id,product_name from product2 order by product_id; -- 取交集intersect、减法except在mysql中不可用,可按照关联子查询方式取交集: select product_id,product_name from product as p1 where product_id= (select product_id from product2 as p2 where p1.product_id=p2.product_id); 以列为单位的表联结 内联结:inner join