SQL三个排序函数 ROW_NUMBER()、RANK()、DENSE_RANK()

ROW_NUMBER()不并列 连续的

RANK()分组不连续排序(跳跃排序)

DENSE_RANK()并列连续

创建实例表:

点击查看代码
DROP table IF EXISTS con;
Create Table IF NOT EXISTS con(id int,Num int);
INSERT INTO con VALUES(1,1);
INSERT INTO con VALUES(2,1);
INSERT INTO con VALUES(3,1);
INSERT INTO con VALUES(4,4);
INSERT INTO con VALUES(5,2);
INSERT INTO con VALUES(6,2);
INSERT INTO con VALUES(7,3);
INSERT INTO con VALUES(8,3);

实例表:

三个函数 ROW_NUMBER()、 RANK()、 DENSE_RANK() 的区别如下图:

SELECT *,
ROW_NUMBER() over(ORDER BY Num DESC) AS 'ROW_NUMBER()',
RANK() over(ORDER BY Num DESC) AS 'RANK()',
DENSE_RANK() over(ORDER BY Num DESC) AS 'DENSE_RANK()'
FROM con;

函数区别结果:

1. TOP N 问题

返回第二高的数字

-- 方法一:DENSE_RANK() 窗口函数
SELECT DISTINCT Num
FROM (
SELECT *,
DENSE_RANK() over(ORDER BY Num) AS dense
FROM con
) AS a
WHERE dense = 2; -- 方法二: 相关子查询
SELECT DISTINCT Num
FROM con AS c1
WHERE 2 = (
SELECT COUNT(DISTINCT Num)
FROM con AS c2
WHERE c1.Num >= c2.Num
)

结果如下:

2. 返回连续出现 N 次的数

返回连续出现三次的数字

情况一:要求 id 连续,而不是表格中的原顺序 的情况下Num连续

点击查看代码

-- 方法一: join on
SELECT DISTINCT c1.Num
FROM con AS c1
JOIN con AS c2 ON c1.Num = c2.Num AND c2.id = c1.id + 1
JOIN con AS c3 ON c3.Num = c2.Num AND c3.id = c2.id + 1
-- 方法二:in
SELECT DISTINCT Num
SELECT *
FROM con
WHERE (id + 1, Num) IN (SELECT * FROM con)
AND (id + 2, Num) IN (SELECT * FROM con)

结果如下:

情况二:按 表格中的行顺序 Num连续

点击查看代码
-- 方法一:排序函数
SELECT DISTINCT Num
FROM (
SELECT *,
-- id 索引值
ROW_NUMBER() over(ORDER BY id) AS number,
-- 分组排序
DENSE_RANK() over(PARTITION BY Num ORDER BY id) AS dense,
-- 差值
ROW_NUMBER() over(ORDER BY id) - DENSE_RANK() over(PARTITION BY Num ORDER BY id) AS different
FROM con
) AS a
GROUP BY Num, different
HAVING count(*) >= 3
-- 方法二: 偏移函数
-- lead()向上偏移 SELECT DISTINCT Num
FROM (
SELECT *,
-- 按照表格中的原顺序, num连续出现相同值
LEAD(Num, 1) over(ORDER BY id) AS l1,
LEAD(Num,2) over(ORDER BY id) AS l2
FROM con
) AS a
WHERE Num = l1 AND l1 = l2;
-- lag() 向下偏移
SELECT DISTINCT Num
FROM (
SELECT *,
-- 按照表格中的原顺序, num连续出现相同值
LAG(Num, 1) over(ORDER BY id) AS l1,
LAG(Num, 2) over(ORDER BY id) AS l2
FROM con
) AS a
WHERE Num = l1 AND l1 = l2;

结果如下:

总结:

  1. TOP N 问题:排序函数 和 相关子查询方法
  2. 返回连续出现数字

    ①连续指的是 按表格中顺序连续出现,排序函数和偏移函数

    ②id连续,JOIN ONIN 两种方法

SQL——连续出现的数字的更多相关文章

  1. LeetCode:180.连续出现的数字

    题目链接:https://leetcode-cn.com/problems/consecutive-numbers/ 题目 编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+--- ...

  2. js验证连续两位数字递增或递减和连续三位数字相同

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  3. SQL Fundamentals || Single-Row Functions || 数字函数number functions

    SQL Fundamentals || Oracle SQL语言 SQL Fundamentals: Using Single-Row Functions to Customize Output使用单 ...

  4. java.sql.SQLSyntaxErrorException: ORA-01722: 无效数字

    ### Error updating database. Cause: java.sql.SQLSyntaxErrorException: ORA-01722: 无效数字 ### The error ...

  5. sql server 提取汉字/数字/字母的方法

    sql server 提取汉字/数字/字母的方法 --提取数字 IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL DROP FUNCTION DBO.GET_NU ...

  6. 180. 连续出现的数字 + MySql + 连续出现数字 + 多表联合查询

    180. 连续出现的数字 LeetCode_MySql_180 题目描述 代码实现 # Write your MySQL query statement below select distinct t ...

  7. [SQL]LeetCode180. 连续出现的数字 | Consecutive Numbers

    SQL架构: Create table If Not Exists Logs (Id int, Num int) Truncate table Logs insert into Logs (Id, N ...

  8. sql 180. 连续出现的数字

    编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+| Id | Num |+----+-----+| 1 | 1 || 2 | 1 || 3 | 1 || 4 | 2 ...

  9. SQL查找连续出现的数字

    基于Oracle: 题:编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | ...

  10. 2018年1月 mybatis+ 动态sql连续日期

    2018-01-111 .   如何在项目中快速查找对应的mapper.xml文件 从Controller入手,使用(Ctrl+鼠标左键)找到Service调用的方法,再找到底层方法,就能找到对应ma ...

随机推荐

  1. Django实现发送邮件

    1.获取QQ邮箱授权码 打开QQ邮箱 --> 设置 --> 账号 --> 下拉页面 --> 开启POP3/SMTP服务 --> 短信验证 --> 点击"我 ...

  2. 测试开发之网络篇-OSI七层协议

    今天,我们来了解一下OSI(Open System Interconnect)开放式系统互连.它是ISO组织在1985年发布的网络互连模型,该标准定义了网络互连的七层框架.其内容简述如下: 我们办公室 ...

  3. 使用 MediaStream Recording API 和 Web Audio API 在浏览器中处理音频(未完待续)

    使用 MediaStream Recording API 和 Web Audio API 在浏览器中处理音频 1. 背景 最近项目上有个需求,需要实现:录音.回放录音.实现音频可视化效果.上传wav格 ...

  4. 使用OHOS SDK构建vorbis

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/xiph/vorbis ...

  5. Pandas高级教程之:Dataframe的重排和旋转

    目录 简介 使用Pivot 使用Stack 使用melt 使用Pivot tables 使用crosstab get_dummies 简介 使用Pandas的pivot方法可以将DF进行旋转变换,本文 ...

  6. C#读 .properties文件

    引用:https://www.cnblogs.com/wardensky/p/5331851.html properties文件 MONGO_URL = mongodb://172.16.20.3/s ...

  7. vue3 快速入门系列 —— vue3 路由

    vue3 快速入门系列 - vue3 路由 在vue3 基础上加入路由. vue3 需要使用 vue-router V4,相对于 v3,大部分的 Vue Router API 都没有变化. Tip:不 ...

  8. 使用pillow制作长图

    这是来自一个妹子的需求,需要将多张图片拼接成一张长图 我是使用pillow这个库来实现的,下面的简单的代码,操作比较简单,代码还有优化的空间 def test(dirpath): ims = [Ima ...

  9. 给你安利一款鲁班大叔开发的maven依赖搜索神器

    写在前面 一款好的插件往往能提高我们的开发效率.今天就给大家安利一款maven 依赖搜索插件. 插件是自己一直关注的鲁班大叔开发的,用了几天真的好用 废话不多说,我们就来看看这是一款什么插件 一.ma ...

  10. OpenStack全网最全部署教程

    简单介绍 简单点来说就是一个云,一个属于自己的云平台,openstack的原版是亚马逊云,可以说openstack就是Rackspace和NASA的抄袭产物. 官方点说一个云平台管理的项目,它不是一个 ...