SQL——连续出现的数字
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;
结果如下:

总结:
- TOP N 问题:排序函数 和 相关子查询方法
- 返回连续出现数字
①连续指的是 按表格中顺序连续出现,排序函数和偏移函数
②id连续,JOIN ON 和 IN 两种方法
SQL——连续出现的数字的更多相关文章
- LeetCode:180.连续出现的数字
题目链接:https://leetcode-cn.com/problems/consecutive-numbers/ 题目 编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+--- ...
- js验证连续两位数字递增或递减和连续三位数字相同
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- SQL Fundamentals || Single-Row Functions || 数字函数number functions
SQL Fundamentals || Oracle SQL语言 SQL Fundamentals: Using Single-Row Functions to Customize Output使用单 ...
- java.sql.SQLSyntaxErrorException: ORA-01722: 无效数字
### Error updating database. Cause: java.sql.SQLSyntaxErrorException: ORA-01722: 无效数字 ### The error ...
- sql server 提取汉字/数字/字母的方法
sql server 提取汉字/数字/字母的方法 --提取数字 IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL DROP FUNCTION DBO.GET_NU ...
- 180. 连续出现的数字 + MySql + 连续出现数字 + 多表联合查询
180. 连续出现的数字 LeetCode_MySql_180 题目描述 代码实现 # Write your MySQL query statement below select distinct t ...
- [SQL]LeetCode180. 连续出现的数字 | Consecutive Numbers
SQL架构: Create table If Not Exists Logs (Id int, Num int) Truncate table Logs insert into Logs (Id, N ...
- sql 180. 连续出现的数字
编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+| Id | Num |+----+-----+| 1 | 1 || 2 | 1 || 3 | 1 || 4 | 2 ...
- SQL查找连续出现的数字
基于Oracle: 题:编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | ...
- 2018年1月 mybatis+ 动态sql连续日期
2018-01-111 . 如何在项目中快速查找对应的mapper.xml文件 从Controller入手,使用(Ctrl+鼠标左键)找到Service调用的方法,再找到底层方法,就能找到对应ma ...
随机推荐
- 才储性格测试(INTJ 专家型——追求能力与独立)
INTJ 专家型--追求能力与独立 一.你的荣格理论图形 二.基本描述 才储分析:您的性格类型倾向为" INTJ "(内向 直觉 思维 判断 倾向度: I60 N56 T74 J5 ...
- HTTP编码和解码与基本认证
咱们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流.那么在这二者之间的转换规则就须要一个统一的标准,不然把计算机上文档就乱码了:因而为了实现转换标准,各类字符集标准 ...
- C++简单实现unique_ptr
唯一指针 管理指针的存储,提供有限的垃圾回收工具,与内置指针相比几乎没有开销(取决于所使用的删除程序). 这些对象具有获取指针所有权的能力:一旦它们获得所有权,它们就会通过在某个时候负责删除指向的对象 ...
- Tomcat内存马分析
前言 自己简单搭建一个Tomcat项目,IDEA里选择JavaEE,勾上web就行了 加个依赖(这样就能找到三个Context了: <dependency> <groupId> ...
- #并查集,树状数组#洛谷 5610 [Ynoi2013] 大学
题目 分析 设最大值为 \(mx\),考虑每个数最多被除以 \(\log{mx}\) 次,那么加上树状数组的维护为 \(O(n\log{n}\log{mx})\) 问题就是如何快速找到这些位置,可以对 ...
- 重磅官宣,OpenHarmony开发者大会来了!
开放原子开源基金会OpenHarmony开发者大会2023将于4月19日在北京召开. 春风送暖万物新,OpenHarmony正当时.诚邀您参加本届大会,聆听行业大咖分享操作系统和开源的最新前沿研究成 ...
- 基于HarmonyOS的HTTPS请求过程开发示例(ArkTS)
介绍 本篇Codelab基于网络模块以及Webview实现一次HTTPS请求,并对其过程进行抓包分析.效果如图所示: 相关概念 ● Webview:提供Web控制能力,Web组件提供网页显示能力. ...
- 【直播预告】HarmonyOS极客松赋能直播第三期:一次开发多端部署与ArkTS卡片开发
- Mysql之innodb架构
Innodb存储引擎的架构 内存结构 Bufer Pool 缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载 ...
- sql 语句系列(更新系列)[八百章之第六章]
使用另一个表更新记录 有时候我们的数据不会立即去更新,而是存在另外一张表中等待更新,这是在日常开发中常见的操作. update e set e.SAL=ns.SAL+e.SAL, e.COMM=ns. ...