关注我们,下载更多资源

预告:12月22日,ACOUG 联合创始人及多位核心专家将欢聚一堂,为“关键词解析2018技术圈的那些事儿”为主题的分享讨论,欢迎大家踊跃报名参会。

点击“阅读原文”立即报名。

详情:【感恩,回馈,展望】2018 ACOUG 年会盛大来袭!

作者:云和恩墨交付工程师,盛杰。

DBA除了日常的运维工作之外,可能还需要对开发人员提出的SQL需求进行建议和实现。最近有遇到几个比较有意思的SQL,在解决的过程中发现,这些SQL的处理思路都是通过找出数据的共同属性来解决。

以下通过两个SQL案例,演示找出数据共同属性的思路。

问题一:

日期

数量

相同数量连续出现的次数

2018/1/1

34

1

2018/1/2

434

1

2018/1/3

34

1

2018/1/4

22

1

2018/1/5

22

2

2018/1/6

22

3

2018/1/7

3

1

2018/1/8

45

1

2018/1/9

56

1

2018/1/10

54

1

2018/1/11

1

1

2018/1/12

4

1

2018/1/13

1

1

2018/1/14

1

2

2018/1/15

1

3

2018/1/16

1

4

2018/1/17

1

5

2018/1/18

1

6

2018/1/19

1

7

2018/1/20

1

8

2018/1/21

1

9

2018/1/22

1

10

2018/1/23

66

1

2018/1/24

9

1

2018/1/25

9

2

2018/1/26

9

3

2018/1/27

9

4

2018/1/28

9

5

2018/1/29

6

1

2018/1/30

67

1

2018/1/31

623

1

根据上方表格,第一列、第二列为原始数据,通过SQL实现算出第三列的值,即第二列相同数量连续出现的次数。


找出共性:

上面问题就是一个找出相同属性的问题,我们可以发现数量连续相同的记录存在一个共性:数量连续相同的任何一条记录 小于它的日期 并且 不等于它的数量 的最大日期 是一样的。

例如:2018/1/4和2018/1/5数量都为22,小于它们日期并且数量不等于22的记录都是2018/1/3这一条。


通过将以上共性转成语句:

select max(dt)

from tb_cnt b

where b.dt < 某条记录的日期

and b.qt != 某条记录的数量

将以上做为分区值,即可实现问题需求。

以下实现:


创建测试表:

create table tb_cnt

as

select to_date('2018/1/1','yyyy/mm/dd') dt,  34 qt from dual union all

select to_date('2018/1/2','yyyy/mm/dd'),  434 from dual union all

select to_date('2018/1/3','yyyy/mm/dd'),  34 from dual union all

select to_date('2018/1/4','yyyy/mm/dd'),  22 from dual union all

select to_date('2018/1/5','yyyy/mm/dd'),  22 from dual union all

select to_date('2018/1/6','yyyy/mm/dd'),  22 from dual union all

select to_date('2018/1/7','yyyy/mm/dd'),  3   from dual union all

select to_date('2018/1/8','yyyy/mm/dd'),  45   from dual union all

select to_date('2018/1/9','yyyy/mm/dd'),  56  from dual union all

select to_date('2018/1/10','yyyy/mm/dd'),  54  from dual union all

select to_date('2018/1/11','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/12','yyyy/mm/dd'),  4  from dual union all

select to_date('2018/1/13','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/14','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/15','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/16','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/17','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/18','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/19','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/20','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/21','yyyy/mm/dd'),  1 from dual union all

select to_date('2018/1/22','yyyy/mm/dd'),  1  from dual union all

select to_date('2018/1/23','yyyy/mm/dd'),  66   from dual union all

select to_date('2018/1/24','yyyy/mm/dd'),  9  from dual union all

select to_date('2018/1/25','yyyy/mm/dd'),  9  from dual union all

select to_date('2018/1/26','yyyy/mm/dd'),  9  from dual union all

select to_date('2018/1/27','yyyy/mm/dd'),  9  from dual union all

select to_date('2018/1/28','yyyy/mm/dd'),  9  from dual union all

select to_date('2018/1/29','yyyy/mm/dd'),  6   from dual union all

select to_date('2018/1/30','yyyy/mm/dd'),  67  from dual union all

select to_date('2018/1/31','yyyy/mm/dd'),  623  from dual;


实现SQL:

select dt 日期, qt 数量, row_number() over(partition by dt_pre order by dt) 计数

from (select dt,

qt,

(select max(dt)

from tb_cnt b

where b.dt < a.dt

and b.qt != a.qt) dt_pre

from tb_cnt a)

order by dt


查询结果:

上面这个问题比较容易出看记录的共同属性,下面来一条相对不容易看出来的。

问题二:

表中有数据q, qa, qq, qaq, qaaaaaaaaaa, aq, aqa, aqq, aaq。

用户通过前台界面,在搜索框输入一个q,则显示结果顺序为:

(1)q

(2)qa

(3)qq

(4)qaq

(5)qaaaaaaaaaa

(6)aq

(7)aqa

(8)aqq

(9)aaq

说明:输出顺序根据数字的从小到大,从先到后:

1.全文匹配。[(1)排在最前]

2.结果与输入内容从前向后开始比对,开始相同字符位越靠前,越排在前面。[(2)(3)(4)(5)在(6)(7)(8)前,(6)(7)(8)在(9)前]

3.看字符相同位后面的字符位数,字符位数少的排前面。[(2)(3)在(4)前,(4)在(5)前,同理(6)在(7)前]

4.字符位数相同时,看字符对应ASCII码,小的排前面。[(2)在(3)前,同理(7)在(8)前]

找出共性:

这是一个排序问题,我们通过以上排序逻辑的描述要求,找出以下共性:

匹配到的字符的左边可能有字符;

匹配到的字符的右边可能有字符;

匹配到字符的左边或右边的字符个数越少越好;

匹配到字符的左边或右边的字符个数相同对比字符大小。

进而产生以下排序条件:

1. 匹配到的字符左边字符的个数

2. 匹配到的字符左边的字符

3. 匹配到的字符右边字符的个数

4. 匹配到的字符右边的字符

通过将以上共性转成语句:

1. nvl(length(substr(x, 0, instr(x, 'q') - 1)), 0)

2. substr(x, 0, instr(x, 'q') - 1)

3. nvl(length(substr(x, instr(x, 'q') + 1, length(x))), 0)

4. substr(x, instr(x, 'q') + 1, length(x))

将以上做为排序条件,即可实现问题需求。

以下实现:

创建测试表:

create table tb_order

as select 'q' x from dual

union all select 'qa' from dual

union all select 'qq' from dual

union all select 'qaq' from dual

union all select 'qaaaaaaaaaa' from dual

union all select 'aq' from dual

union all select 'aqa' from dual

union all select 'aqq' from dual

union all select 'abq' from dual

union all select 'acq' from dual

union all select 'acqb' from dual;


实现SQL:

select x

from tb_order

where x like '%q%'

order by nvl(length(substr(x, 0, instr(x, 'q') - 1)), 0),

substr(x, 0, instr(x, 'q') - 1),

nvl(length(substr(x, instr(x, 'q') + 1, length(x))), 0),

substr(x, instr(x, 'q') + 1, length(x));


查询结果:


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2018DTC,2018 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2018OOW ,Oracle OpenWorld 资料

PRELECTION ,大讲堂讲师课程资料

近期文章

企业数据架构的云化智能重构和变革(含大会PPT)

Oracle研发总裁Thomas Kurian加盟Google Cloud

变与不变: Undo构造一致性读的例外情况

Oracle 18c新特性:动态 Container Map 增强 Application Container 灵活性

Oracle 18c新特性:Schema-Only 帐号提升应用管理安全性

Oracle 18c新特性:多租户舰队 CDB Fleet (含PPT)

为什么看了那么多灾难,还是过不好备份这一关?

一招教你玩转SQL:通过找出数据的共同属性实现SQL需求相关推荐

  1. 9个妙招教你玩转微信

    为什么80%的码农都做不了架构师?>>>    微信怎 么用?这个看似有些可笑的问题,却暗示着微信其实并不"简单".微信现在已经是一款"全民应用&quo ...

  2. 一招教你如何高效批量导入与更新数据

    一招教你如何高效批量导入与更新数据 前言 如果有一张表,我们既想对它更新,又想对它插入应该如何操作? 可以使用 UPDATE 和 INSERT 完成你的目标. 如果你的数据量很大,想尽快完成任务执行, ...

  3. 2022-12-05:部门工资前三高的所有员工。编写一个SQL查询找出每个部门中收入前三高的员工 。 +------------+----------+--------+ | Department |

    2022-12-05:部门工资前三高的所有员工.编写一个SQL查询找出每个部门中收入前三高的员工 . ±-----------±---------±-------+ | Department | Em ...

  4. sql安装弹出sqlcmd_讨论使用SQLCMD和SQL Server代理进行备份和还原自动化

    sql安装弹出sqlcmd Database administrators are often requested to refresh a database, mostly to create a ...

  5. 实战内容(15)- 简单几招教你玩转音视频 DIY

    目录 前言 正文 一.概念解惑 1. 视频 2. 音频 3. 工具 二.音视频 DIY

  6. 一招教你轻松从图像中裁剪出婚纱礼服和面纱

    Super PhotoCut Pro是一款简单粗暴的抠图软件,它能够准确地覆盖你想要去除的任何一个细节区域,抠出图片中你最想要的部分,不需要任何的技巧,那么photocut怎么用呢?你只需要在图片上勾 ...

  7. 别怕,三招教你恢复TF卡分区后的数据

    随着移动设备的普及,TF卡这种小型存储设备已经成为我们日常生活中必不可少的工具.不过,如果您不小心对TF卡进行了分区操作,容易导致数据丢失,这样会给您的工作和生活带来不便.那么,在这个问题出现时,您应 ...

  8. 如何找出MySQL数据库中的低效SQL语句

    面对业务的迅猛发展,DBA的一项重要工作就是及时发现数据库中的低效SQL语句,有的可以立刻着手解决(比如缺少合适的索引),有的需要尽快反馈给开发人员进行修改. MySQL数据库有几个配置选项可以帮助我 ...

  9. mysql一条sql更新多条数据_执行一条sql语句update多条记录实现思路

    如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?本文以一个示例向大家讲解下如何实现如标题所示的情况,有此需求的朋友可以了解下 通常情况下,我们会使用以下SQL语句来更新字段值: ...

最新文章

  1. matlab 取消figure显示时在屏幕最前
  2. 2021年春季学期-信号与系统-第六次作业参考答案-第九小题
  3. testlink mysql配置_Testlink安装后配置修改
  4. 求一个二维整数数组最大子数组之和,时间复杂度为N^2
  5. 在 Snoop 中使用 PowerShell 脚本进行更高级的 UI 调试
  6. 自学几小时,斯坦福AI推测并复现了元素周期表 | 华裔团队研究
  7. 智能制造数字化车间的实施策略(上)
  8. 海康大华网络录像机摄像机设备几种NTP校时方法
  9. 探寻微博背后的大数据原理:微博推荐算法简述
  10. Python面向对象加强4.iter与next的用法,枚举器enumerate
  11. sqlite3 二进制读取
  12. POJ 1625 Censored! (AC自动机 + 高精度 + DP)
  13. java的几种基本数据类型及其大小
  14. 摄像头CMOS CCD
  15. sw标准件不能配置_sw标准件库调不出来(在使用solidworks2009标准件库 调不出零件)...
  16. 「技术工具」阿里开源Java在线诊断工具 Arthas 进阶教程
  17. [iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想)
  18. 单细胞数据分群的几种方法
  19. mysql5.7.26msi安装教程_mysql5.7.18MSI安装图文教程
  20. 人工智能培训老师讲师叶梓:计算机视觉领域的自监督学习模型——MAE-2

热门文章

  1. 微软批量许可 开放许可区别_网络漫画因开放许可而适用于动画
  2. 实战 | 后端日志的前世今生
  3. 通俗理解滑模变结构(2)
  4. php curl无视ssl,用Curl实现Post和Get请求,可绕过SSL验证
  5. python脚本自动运行失败_Linux中定时任务执行python脚本失败的解决方法
  6. python的except之后还运行吗_python except异常处理之后不退出,如何解决异常继续执行...
  7. webstorm 设置js或者html文件自动缩进为4个空格不生效
  8. linux压缩与解压
  9. 比特币交易(Transaction)的输入与输出
  10. 1.11 UML 类图(多看多用就熟悉了)(节选自:《大话设计模式》)