首页 > 数据库 >SQL——连续出现的数字

SQL——连续出现的数字

时间:2024-05-09 16:23:20浏览次数:13  
标签:数字 -- RANK Num 连续 SQL id SELECT con

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 两种方法

标签:数字,--,RANK,Num,连续,SQL,id,SELECT,con
From: https://www.cnblogs.com/anran-0/p/18182493

相关文章

  • 【转】[MySQL] 忘记密码的处理之 Windows 篇
    来自:阿里的通义灵码在Windows环境下,如果你忘记了MySQL的root密码,可以通过以下步骤重置:停止MySQL服务:打开“服务”管理工具(可以通过运行 services.msc 或搜索“服务”找到)。找到名为 MySQL 或 MySQL80(根据你的版本)的服务,然后右键选择“停止”。找到MySQ......
  • 【转】[MySQL] 忘记密码的处理之 Linux 篇
    来自:阿里的通义灵码如果你忘记了MySQL的root用户密码,可以按照以下步骤重置:方法1:使用 mysqld_safe 跳过授权表停止MySQL服务:bash sudoservicemysqlstop启动MySQL并跳过授权表:bash sudomysqld_safe--skip-grant-tables&登录到MyS......
  • mysql8.0数据库添加用户和授权
    MySql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作1.创建新用户createuser'username'@'host'identifiedby'password';其中username为自定义的用户名;host为登录域名,host为'%'时表示为任意IP,为localhost时表示本机,或者填写指......
  • SqlFunc查询函数
    一、常用的C#函数支持一些常用的C#函数.ToString().Contains().Length().ToLower().ToUpper().ToSubstring().Equals().Replace().EndsWith().StartsWith().Trim().HasValue.Value.AddDays(AddHours等)和常用的Convert.ToInt32等三元xx??0时......
  • Python 如何优雅的操作 PyMySQL
    一、PyMysql在使用Python操作MySQL数据过的过程中,基本的增删改查操作如何更加高效优雅的执行。这里将以PyMySQL为例,介绍一下如何使用Python操作数据库。Python对MySQL数据库进行操作,基本思路是先连接数据库Connection对象,建立游标Cursor对象,然后执行SQL语句对数据库进行操作......
  • 中电金信:看 “咨询+技术”如何引领数字化变革新风向
    当前,新一轮创新技术和产业变革正在重塑全球的经济格局。日本政府及社会各界也从各个领域着手推进数字化。2021年,日本政府成立了“数字厅”,通过一系列举措推动数字化升级,希望将日本加速转型为数字经济的区域领导者,日本企业也积极开展数字化转型为业务创造价值。 中电金信认为,日......
  • mysql多表查询
    1.多表查询  项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)多对多一对一2.分类连接查询内连接:相当于查询A、B交集部分数据外......
  • SQL查询语句执行顺序
    SQL语句定义顺序SELECTDISTINCT<select_list>FROM<left_table><join_type>JOIN<right_table>ON<join_condition>WHERE<where_condition>GROUPBY<group_by_list>HAVING<having_condition>ORDERBY<order_by_c......
  • Mysql替换字段中指定字符(replace 函数)
    一、简介函数将字符串中出现的所有子字符串替换为新的子字符串。REPLACE()函数是基于字符的替换,并且替换字符串时是区分大小写的。二、语法这里是MySQLREPLACE()函数的语法:REPLACE(str,from_str,to_str)参数str必需的。原字符串。from_str必需的。被替换的子字符......
  • mysql~数据完整性考虑~外键约束
    在MySQL中,当为表添加外键约束时,可以指定在删除或更新父表记录时的行为。下面进行总结:CASCADE:当父表中的记录被删除或更新时,自动删除或更新子表中相关联的记录。这意味着如果父表中的记录被删除,那么相应的子表中与之关联的记录也会被删除。SETNULL:当父表中的记录被删除或更......