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. JDBC反序列化分析

    环境依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java& ...

  2. C++ 自动计时

    #include<iostream> #include<chrono> struct Timer { std::chrono::time_point<std::chron ...

  3. #欧拉函数#洛谷 2303 [SDOI2012] Longge 的问题

    题目 求\(\sum_{i=1}^n\gcd(n,i)\) 分析 \(=\sum_{i=1}^n\sum_{d|gcd(n,i)}\varphi(d)\) \(=\sum_{d|n}\varphi(d ...

  4. Java基础知识:面试官必问的问题

    数据类型 基本类型 byte/8 char/16 short/16 int/32 float/32 long/64 double/64 boolean/~ boolean 只有两个值:true.fal ...

  5. 冒泡排序的基本实现【数据结构与算法—TypeScript 实现】

    笔记整理自 coderwhy 『TypeScript 高阶数据结构与算法』课程 概念 本质:相邻元素两两比较并交换位置,使整个序列按照特定的顺序排列 特性 复杂度分析 时间复杂度: 最好情况:O(n) ...

  6. LTV预估的一些思考

    什么是LTV 用户生命周期价值(Lifetime Value, LTV)是一个非常重要的指标,定义为单个用户在某种生命周期内(i.e. 从开始使用产品到停止使用期间) 为产品创造的总价值. 比如GMV ...

  7. 日志分析qsnctfwp

    使用工具:http Logs Viewer 使用 http Logs Viewer 载入 access.log 按照 Status 排序 其中大量 Status 为404的日志不难推断出,这是在进行目 ...

  8. linux ssh连接

    前言 整理以前的随笔. 正文 首先更新源 sudo apt-get update 安装ssh服务 sudo apt-get install openssh-server 检测是否已启动 ps -e | ...

  9. 关于伺服刹车/急停/前后设备信号对接/PLC输入输出模块的公共端介绍

    一.伺服刹车 关键词:急停,急停中间继电器.刹车中间继电器,刹车使能 正文: 通常情况不用硬件为主导而用程序来主导控制,多场景应用方便修改且安全可靠. 伺服刹车硬件,一般是24v电源给进去,就会释放刹 ...

  10. 力扣1620(java&python)-网络信号最好的坐标(中等)

    题目: 给你一个数组 towers 和一个整数 radius . 数组  towers  中包含一些网络信号塔,其中 towers[i] = [xi, yi, qi] 表示第 i 个网络信号塔的坐标是 ...