Oracle查询排列组合,Oracle SQL排列组合之组合问题
产品部门有一个分析需求,简化后是个组合问题,简单表述如下:
表结构
c4列表示状态,c1,c2,c3只要一个不为空,c4就为Y
现在想知道每个组合的情况
比如为什么组合(c1、c2)的值是2,因为只有2行(第1行、第3行)数据满足c1、c2都不为空
相关测试sql代码如下:
SQL> create table t (
2 id varchar2(1),
3 c1 int,
4 c2 int,
5 c3 int,
6 c4 varchar2(1)
7 );
Table created.
SQL> insert into t values ('a',1,1,null,'Y');
1 row created.
SQL> insert into t values ('b',null,1,1,'Y');
1 row created.
SQL> insert into t values ('c',1,1,1,'Y');
1 row created.
SQL> insert into t values ('d',1,null,null,'Y');
1 row created.
SQL> commit;
Commit complete.
SQL> select replace(path, '.*') path, count(1) cnt
2 from (select *
3 from (select (sys_connect_by_path(pivot_char, '.*')) Path
4 from (select regexp_substr(csv.csvdata, '[^,]+', 1, level) Pivot_char
5 from (select 'C1,C2,C3' as csvdata from dual) csv
6 connect by level <= 3)
7 connect by prior Pivot_char < Pivot_char
8 order by length(path), path) a,
9 (select nvl2(c1, 'C1', null) || nvl2(c2, 'C2', null) ||
10 nvl2(c3, 'C3', null) col_not_null
11 from t) b
12 where regexp_instr(b.col_not_null, a.path) > 0)
13 group by path
14 /
PATH CNT
---------- ----------
C1 3
C2 3
C1C2 2
C2C3 2
C3 2
C1C3 1
C1C2C3 1
7 rows selected.
主要思路是构造所有可能的组合和表中实际数据关联匹配得出结果:
第一步:构造3行数据
SQL> select regexp_substr(csv.csvdata, '[^,]+', 1, level) Pivot_char
2 from (select 'C1,C2,C3' as csvdata from dual) csv
3 connect by level <= 3
4 /
PIVOT_CHAR
----------------
C1
C2
C3
第二步:3行数据所有组合情况,(.*)是为了后期正则匹配
SQL> select (sys_connect_by_path(pivot_char, '.*')) Path
2 from (select regexp_substr(csv.csvdata, '[^,]+', 1, level) Pivot_char
3 from (select 'C1,C2,C3' as csvdata from dual) csv
4 connect by level <= 3)
5 connect by prior Pivot_char < Pivot_char
6 order by length(path), path
7 /
PATH
--------------------------------------------------------------------------------
.*C1
.*C2
.*C3
.*C1.*C2
.*C1.*C3
.*C2.*C3
.*C1.*C2.*C3
第三步:表中实际数据的组合情况
SQL> select nvl2(c1, 'C1', null) || nvl2(c2, 'C2', null) || nvl2(c3, 'C3', null) col_not_null
2 from t
3 /
COL_NOT_NULL
------
C1C2
C2C3
C1C2C3
C1
第四步:可能的7种组合和表中实际数据的组合情况关联匹配出结果,如(C1C2)可以匹配(C1)(C2)(C1C2)三种情况,最后结果如下
SQL> select replace(path, '.*') path, count(1) cnt
2 from (select *
3 from (select (sys_connect_by_path(pivot_char, '.*')) Path
4 from (select regexp_substr(csv.csvdata, '[^,]+', 1, level) Pivot_char
5 from (select 'C1,C2,C3' as csvdata from dual) csv
6 connect by level <= 3)
7 connect by prior Pivot_char < Pivot_char
8 order by length(path), path) a,
9 (select nvl2(c1, 'C1', null) || nvl2(c2, 'C2', null) ||
10 nvl2(c3, 'C3', null) col_not_null
11 from t) b
12 where regexp_instr(b.col_not_null, a.path) > 0)
13 group by path
14 /
PATH CNT
---------- ----------
C1 3
C2 3
C1C2 2
C2C3 2
C3 2
C1C3 1
C1C2C3 1
7 rows selected.
第一篇文章...
Oracle查询排列组合,Oracle SQL排列组合之组合问题相关推荐
- oracle执行sql痕迹,Oracle 查询刚执行的SQL
Oracle 查询刚刚执行的SQL select "SQL_TEXT", "SQL_FULLTEXT", "SQL_ID", "S ...
- oracle查看执行过的语句,oracle 查询执行过的SQL语句
MySQL开启日志记录查询/执行过的SQL语句 作为后端开发者,遇到数据库问题的时候应该通过分析SQL语句来跟进问题所在,该方法可以记录所有的查询/执行的SQL语句到日志文件. 方法有几种,但是个人觉 ...
- oracle查询列取名,oracle查询列名
oracle 动态列查询,,oracle查询列名,oracle查询动态sql oracle 动态查询列,查看oracle数据库的表名和列名,oracle查询列名,oracle查询列属性 oracle ...
- oracle查询结果添加序列,SQL查询结果增加序列号
SQL查询记录中增加序列号 根据学生成绩在查询结果中增加排名字段: 1.SELECT ROW_NUMBER() OVER (ORDER BY SCORE ASC) AS RANK,NAME,SCORE ...
- oracle查询语句大全(oracle 基本命令大全一)
来源:http://www.jb51.net/article/40467.htm 1.create user username identified by password;//建用户名和密码orac ...
- oracle 查询公有同义词,Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)
一团网资讯 一团资讯 > oracle > Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)... Oracle序列(sequence ...
- oracle 查询条件 if,oracle查询语句if
oracle语句查询or和andSELECT*FROMPersonsWHERE(FirstName=' (FirstName='Thomas' OR FirstName='William') AND ...
- oracle 查询连接方法,Oracle 常用连接查询方法和函数
Oracle常用的连接查询方法(以oracle自带的表做的练习),left join是以左表的记录为基础的,左表中的记录会全部显示,右表只显 一:Oracle常用的连接查询方法(以oracle自带的表 ...
- oracle查询flashback,【oracle】闪回flashback-10g-flashback query
Flashback Query 1.说明 flashback是oracle9i开始提供的特性.在9i中利用oracle查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据对 ...
- oracle+查询主机地址,oracle函数:获取Internet主机名和ip地址
您可能感兴趣的话题: Oracle 核心提示:oracle函数获取Internet主机名和ip地址 Oracle包utl_inaddr 作用:用于取得局域网或Internet环境中的主机名和IP地址. ...
最新文章
- apkplug利用plugin.xml传递自定义属性
- react-native init MyProject之后发生了什么
- c语言单元测验,C语言程序设计单元测验一.PDF
- .NETFramework-Web.Mvc:ViewResult
- SpringCloud创建Config多客户端公共配置
- python 获取当前月份月初日期和月末日期
- JPA还是JDBC?
- 大数据开发笔记(九):Flink综合学习
- tensorflow之pd模型
- centos7 mysql读写监控,《Centos7——zabbix监控mysql的常规操作》
- c语言立体爱心会跳动,c语言编程实例——小球跳动
- 软件推荐,强力卸载软件geek uninstaller
- 金士顿U盘写保护去除
- RS-232与RS485通信方式区别
- 【游戏】——微信打飞机
- 银行的压力测试如何进行?
- Matlab如何在一个窗口绘制多张子图
- Qt全局坐标和相对坐标
- 绿荫工作室爱选修app内测
- 解决单元测试时报Could not instantiate问题
热门文章
- SSM项目使用ConfigTools对数据库的密码进行加密
- Power query (Power BI)一步到位傻瓜式合并工作簿,史上最好用
- 利用python多个工作簿合并到一个工作簿
- 安装drupal9报错
- Ubuntu16.04使用语义分割标注工具Semantic-Segmentation-Editor
- 禾多科技与RTI达成合作,加速自动驾驶在中国量产落地
- Spring Boot 集成Spring Schedule定时任务执行功能(动态修改执行时间)
- java研发微博营销
- 植物大战僵尸:游戏中的“修改器【Python】”一定是作弊?善用增加趣味性!
- python模块导入详解