Oracle:在可空值上分区的分析函数
我不想计算空值。因为NULL不应该等于NULL 查看此查询结果:Oracle:在可空值上分区的分析函数,oracle,Oracle,我不想计算空值。因为NULL不应该等于NULL 查看此查询结果: 如果不想筛选出master为空的行,可以执行以下操作 选择master, 总和(主值为空时的情况) 然后0 其他1 结束)结束(主分区) 临时工 SQL> ed Wrote file afiedt.buf 1 WITH temp as ( 2 SELECT 'A' as master , 1 Col from dual 3 UNION SELECT 'A' , 3 from dual 4 UNIO
如果不想筛选出
master
为空的行,可以执行以下操作
选择master,
总和(主值为空时的情况)
然后0
其他1
结束)结束(主分区)
临时工
SQL> ed
Wrote file afiedt.buf
1 WITH temp as (
2 SELECT 'A' as master , 1 Col from dual
3 UNION SELECT 'A' , 3 from dual
4 UNION SELECT 'B' , 1 from dual
5 UNION SELECT 'B' , 2 from dual
6 UNION SELECT 'C' , 1 from dual
7 UNION SELECT NULL , 1 from dual
8 UNION SELECT NULL , 2 from dual)
9 SELECT master,
10 SUM( CASE WHEN master IS NULL
11 THEN 0
12 ELSE 1
13 END) OVER (PARTITION BY master)
14* FROM temp
SQL> /
M SUM(CASEWHENMASTERISNULLTHEN0ELSE1END)OVER(PARTITIONBYMASTER)
- -------------------------------------------------------------
A 2
A 2
B 2
B 2
C 1
0
0
Null不等于Null。但从聚合的角度来看,null等同于null。并不是分析能做到这一点;这是聚合本身
1 WITH temp as (
2 SELECT 'A' as master , 1 Col from dual
3 UNION SELECT 'A' , 3 from dual
4 UNION SELECT 'B' , 1 from dual
5 UNION SELECT 'B' , 2 from dual
6 UNION SELECT 'C' , 1 from dual
7 UNION SELECT NULL , 1 from dual
8 UNION SELECT NULL , 2 from dual )
9 SELECT
10 master,
11 count(Col)
12 FROM
13* temp group by master
SQL> /
M COUNT(COL)
- ----------
2
A 2
B 2
C 1
或者,过滤掉它们:
1 WITH temp as (
2 SELECT 'A' as master , 1 Col from dual
3 UNION SELECT 'A' , 3 from dual
4 UNION SELECT 'B' , 1 from dual
5 UNION SELECT 'B' , 2 from dual
6 UNION SELECT 'C' , 1 from dual
7 UNION SELECT NULL , 1 from dual
8 UNION SELECT NULL , 2 from dual)
9 SELECT
10 master,
11 count(Col) over (partition by master)
12 FROM
13 temp
14* WHERE master is not null
SQL> /
M COUNT(COL)OVER(PARTITIONBYMASTER)
- ---------------------------------
A 2
A 2
B 2
B 2
C 1
另外,如果
col
可以为空,并且您也不希望对这些行进行计数,那么在(按主分区)上进行计数(如果主分区不为空,则col else null end)
注意:else null
是可选的,如果没有条件匹配,则检测默认值,case
返回null。如果您不关心col
是否为null,则只需执行count(master)over(按master分区)
。而不是Justin的“sum(case…)
1 WITH temp as (
2 SELECT 'A' as master , 1 Col from dual
3 UNION SELECT 'A' , 3 from dual
4 UNION SELECT 'B' , 1 from dual
5 UNION SELECT 'B' , 2 from dual
6 UNION SELECT 'C' , 1 from dual
7 UNION SELECT NULL , 1 from dual
8 UNION SELECT NULL , 2 from dual)
9 SELECT
10 master,
11 count(Col) over (partition by master)
12 FROM
13 temp
14* WHERE master is not null
SQL> /
M COUNT(COL)OVER(PARTITIONBYMASTER)
- ---------------------------------
A 2
A 2
B 2
B 2
C 1