Oracle SQL排列组合之组合问题
来源:互联网 发布:幸运星 知乎 编辑:程序博客网 时间:2024/06/11 18:44
产品部门有一个分析需求,简化后是个组合问题,简单表述如下:
表结构
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----------------C1C2C3
第二步: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------C1C2C2C3C1C2C3C1
第四步:可能的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.
第一篇文章...
阅读全文
1 0
- Oracle SQL排列组合之组合问题
- Oracle SQL排列组合之排列问题
- 排列组合之组合问题算法实现
- 排列组合之种树问题
- 组合数学之排列组合若干题
- 算法练习:排列组合之组合和
- 回溯法之排列组合问题
- 排列组合,子集生成问题,与nyoj 组合数
- 排列组合之字符串的全排列和组合算法
- 关于数学中排列组合之组合算法实现
- 排列组合之生成组合_(:з」∠)_
- 组合数学->排列组合
- 排列组合------组合篇
- hdu 1521 排列组合 组合
- 组合数学-排列组合整理
- 排列组合之排列问题的算法实现
- 排列组合之错排问题总结
- 排列组合问题
- 哈希函数
- sublime text3 python代码自动提示/补全插件sublimecodeintel配置
- hive安装过程:metastore(元数据存储)的三种方式之本地mysql方式
- Android 蓝牙BLE 中onCharacteristicChanged不走回调的解决方案
- 什么是C++虚函数、虚函数的作用和使用方法
- Oracle SQL排列组合之组合问题
- 数学资源汇总
- 主机MAC VitualBox中ubuntu挂载MAC共享文件夹
- 交换机生成树协议STP的配置命令
- House Robber II (houses are arranged in a circle)
- java加密与解密的艺术(五)——数字签名
- POJ1142 HDU1333 ZOJ1133 Smith Numbers【质因数分解+素数判定+数位之和】
- HTML head 头部分的标签
- scrollview嵌套listview 嵌套HorizontalScrollView嵌套gridview 焦点及卡顿问题