返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >SQL查询连续号码段的巧妙解法
  • 640
分享到

SQL查询连续号码段的巧妙解法

连续号码段 2022-11-15 23:11:02 640人浏览 独家记忆
摘要

昨天在itpub看到这个帖子, 问题觉得有意思,, 就仔细想了想. 也给出了一种解决办法..:-) 问题求助,请高手指点.. 我有一个表结构,fphm,kshm2014,000000

昨天在itpub看到这个帖子, 问题觉得有意思,, 就仔细想了想. 也给出了一种解决办法..:-)

问题求助,请高手指点..

我有一个表结构,
fphm,kshm
2014,00000001
2014,00000002
2014,00000003
2014,00000004
2014,00000005
2014,00000007
2014,00000008
2014,00000009
2013,00000120
2013,00000121
2013,00000122
2013,00000124
2013,00000125

(第二个字段内可能是连续的数据,可能存在断点。)

怎样能查询出来这样的结果,查询出连续的记录来。

就像下面的这样?

2014,00000001,00000005
2014,00000009,00000007
2013,00000120,00000122
2013,00000124,00000125

方法一: 引用自hmxxyy.


sql> select * from gap;

ID SEQ
---------- ----------
1 1
1 4
1 5
1 8
2 1
2 2
2 9

select res1.id, res2.seq str, res1.seq end
from (
select rownum rn, c.*
from (
select *
from gap a
where not exists (
select null from gap b where b.id = a.id and a.seq = b.seq - 1
)
order by id, seq
) c
) res1, (
select rownum rn, d.*
from (
select *
from gap a
where not exists (
select null from gap b where b.id = a.id and a.seq = b.seq + 1
)
order by id, seq
) d
) res2
where res1.id = res2.id
and res1.rn = res2.rn
/

ID STR END
--------- ---------- ----------
1 1 1
1 4 5
1 8 8
2 1 2
2 9 9

方法二: 使用lag/lead分析函数进行处理.. 楼上的方法确实挺好用就是觉得表扫描/表连接比较多, 可能数据量大了. 速度会比较慢, 当然我的这种方法由于使用分析函数使用的比较频繁.所以排序量可能比上一种要多..


SQL> select fphm,lpad(kshm,8,'0') kshm
  2  from t
  3  /

      FPHM KSHM                                                                
---------- ----------------                                                    
      2014 00000001                                                            
      2014 00000002                                                            
      2014 00000003                                                            
      2014 00000004                                                            
      2014 00000005                                                            
      2014 00000007                                                            
      2014 00000008                                                            
      2014 00000009                                                            
      2013 00000120                                                            
      2013 00000121                                                            
      2013 00000122                                                            

      FPHM KSHM                                                                
---------- ----------------                                                    
      2013 00000124                                                            
      2013 00000125                                                            

13 rows selected.

SQL> set echo on
SQL> @bbb.sql
SQL> select fphm,lpad(kshm,8,'0') start_kshm,lpad(prev_prev_kshm,8,'0') end_kshm
  2  from (
  3    select fphm,kshm,next_kshm,prev_kshm,
  4  lag(kshm,1,null) over (partition by fphm order by kshm )next_next_kshm,
  5  lead(kshm,1,null) over (partition by fphm order by kshm ) prev_prev_kshm
  6    from (
  7  select *
  8  from (
  9     select fphm,kshm,
10       lead(kshm,1,null) over (partition by fphm order by kshm) next_kshm,
11       lag(kshm,1,null) over (partition by fphm order by kshm) prev_kshm
12     from t
13  )
14  where ( next_kshm - kshm <> 1 or kshm - prev_kshm <> 1 )
15  or ( next_kshm is null or prev_kshm is null )
16    )
17  )
18  where next_kshm - kshm = 1
19  /

      FPHM START_KSHM       END_KSHM                                           
---------- ---------------- ----------------                                   
      2013 00000120         00000122                                           
      2013 00000124         00000125                                           
      2014 00000001         00000005                                           
      2014 00000007         00000009                                           

SQL> spool off

方法三: 今天早上wildflower给了我这个答案, 顿时觉得耳目一新啊..就贴出来与大家一起共享了^_^.


SQL> spool aaa.log
SQL> set echo on
SQL> select * from t;

no rows selected

SQL> select * from t;

      FPHM       KSHM
---------- ----------
      2014          1
      2014          2
      2014          3
      2014          4
      2014          5
      2014          7
      2014          8
      2014          9
      2013        120
      2013        121
      2013        122

      FPHM       KSHM
---------- ----------
      2013        124
      2013        125

13 rows selected.

SQL> @bbb.sql
SQL> select b.fphm,min(b.kshm),max(b.kshm)
  2  from (
  3          select a.*,to_number(a.kshm-rownum) cc
  4          from (
  5                  select * from t order by fphm,kshm
  6          ) a
  7  )  b
  8  group by b.fphm,b.cc
  9  /

      FPHM MIN(B.KSHM) MAX(B.KSHM)
---------- ----------- -----------
      2013         120         122
      2013         124         125
      2014           1           5
      2014           7           9

SQL>

--结束END--

本文标题: SQL查询连续号码段的巧妙解法

本文链接: https://lsjlt.com/news/172825.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SQL查询连续号码段的巧妙解法
    昨天在itpub看到这个帖子, 问题觉得有意思,, 就仔细想了想. 也给出了一种解决办法..:-) 问题求助,请高手指点.. 我有一个表结构,fphm,kshm2014,000000...
    99+
    2022-11-15
    连续号码段
  • 如何实现SQL查询连续号码段
    这篇文章主要介绍“如何实现SQL查询连续号码段”,在日常操作中,相信很多人在如何实现SQL查询连续号码段问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现SQL查询连续号...
    99+
    2024-04-02
  • SQL 查询连续登录的用户情况
    以连续3天为例,使用工具:MySQL。 1.创建SQL表: create table if not exists orde(id varchar(10),date da...
    99+
    2024-04-02
  • 如何通过SQL Server的位运算功能巧妙解决多选查询方法
    本篇文章为大家展示了如何通过SQL Server的位运算功能巧妙解决多选查询方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。无论使用int还是varchar,对于...
    99+
    2024-04-02
  • SQL 如何查询连续上涨 N 次的记录
    用SQL如何查询连续上涨N次的记录? 这个问题用SQL来做很难! SQL的理论基础是无序集合,早期SQL也没有次序的概念,需要用JOIN造出次序,连续上涨这种问题就非常困难。后来在SQL2003标准中加入了窗口函数,一定程度地缓解了这个...
    99+
    2017-02-21
    SQL 如何查询连续上涨 N 次的记录
  • SQL怎么查询连续登录的用户情况
    这篇文章主要为大家展示了“SQL怎么查询连续登录的用户情况”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL怎么查询连续登录的用户情况”这篇文章吧。以连续3天为例,使用工具:MySQL。创建S...
    99+
    2023-06-22
  • SQL查询至少连续七天下单的用户
    创建表格 create table orde(id varchar(10),date datetime,orders varchar(10)); insert ...
    99+
    2024-04-02
  • SQL查询至少连续n天登录的用户
    以连续3天为例,使用工具:MySQL。 1.创建SQL表: create table if not exists orde(id varchar(10),date date...
    99+
    2024-04-02
  • SQL怎么查询连续上涨 N 次的记录
    小编今天带大家了解SQL怎么查询连续上涨 N 次的记录,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“SQL怎么查询连续上涨 N 次的...
    99+
    2023-06-03
  • SQL中的连接查询详解
    Join 连接 (SQL Join) SQL Join (连接) 是利用不同数据表之间字段的关连性来结合多数据表之检索。 SQL Join是结合多个数据表而组成一抽象的暂时性数据表以供数据查...
    99+
    2022-06-18
    SQL 连接查询
  • Hive-SQL查询连续活跃登录用户思路详解
    连续活跃登陆的用户指至少连续2天都活跃登录的用户 解决类似场景的问题 创建数据 CREATE TABLE test5active( dt string, user_id stri...
    99+
    2024-04-02
  • SQL查询连续登陆7天以上的用户的方法实现
    查询7天连续登陆用户这个问题很经典,解决方法也有很多,这里我讲一下笔者的方法,希望对大家有帮助。 具体思路: 1、因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重...
    99+
    2024-04-02
  • SQL查询语句求出用户的连续登陆天数
    一、题目描述 求解用户登陆信息表中,每个用户连续登陆平台的天数,连续登陆基础为汇总日期必须登陆,表中每天只有一条用户登陆数据(计算中不涉及天内去重)。 表描述:user_id:用户的...
    99+
    2024-04-02
  • SQL怎么查询至少连续七天下单的用户
    本篇内容介绍了“SQL怎么查询至少连续七天下单的用户”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!创建表格create table...
    99+
    2023-06-22
  • MySQL查询指定字段不是数字与逗号的sql
    核心sql语句 MySQL查询不包含数字的语句: SELECT * FROM test WHERE `name` regexp '[^0-9]'; MySQL查询纯数字的语句: SEL...
    99+
    2024-04-02
  • sql字段拼接查询的方法是什么
    在 SQL 中,可以使用 CONCAT 函数来拼接字段查询。例如,假设有两个字段 first_name 和 last_name,要将...
    99+
    2024-03-04
    sql
  • SQL查询之字段是逗号分隔开的数组怎么查询匹配数据
    这篇文章主要介绍“SQL查询之字段是逗号分隔开的数组怎么查询匹配数据”,在日常操作中,相信很多人在SQL查询之字段是逗号分隔开的数组怎么查询匹配数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2023-03-09
    sql
  • 如何使用SQL查询至少连续n天登录的用户
    这篇文章主要为大家展示了“如何使用SQL查询至少连续n天登录的用户”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用SQL查询至少连续n天登录的用户”这篇文章吧。1.创建SQL表:creat...
    99+
    2023-06-22
  • SQL查询之字段是逗号分隔开的数组如何查询匹配数据问题
    目录字段是逗号分隔开的数组如何查询匹配数据方式一:CHARINDEX***()*****方式二:WHERE LIKEmysql逗号分隔的字段查询1.like2.find_in_set3.regexp总结字段是逗号...
    99+
    2023-03-06
    SQL查询 查询匹配数据 SQL逗号分隔开数组
  • sql多表连接查询的方法是什么
    在SQL中,可以使用JOIN子句来实现多表连接查询。JOIN子句用于将多个表中的记录进行连接,以便在查询结果中同时显示来自不同表的数...
    99+
    2024-04-09
    sql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作