oracle - 使用 MATCH_RECOGNIZE 时 FINAL SUM 的 NULLIF 翻倍
问题描述
当我运行下面的代码时,我期望b1
和b2
是相等的,然而,b2
是加倍的。难道我做错了什么?这是数据库中的错误吗?我们在跑Oracle 12c
(12.2.0.1.0)
。
WITH TBL AS
(
SELECT 1 a, 1 b FROM DUAL UNION ALL
SELECT 1 a, 2 b FROM DUAL UNION ALL
SELECT 1 a, 3 b FROM DUAL UNION ALL
SELECT 1 a, 4 b FROM DUAL
)
SELECT
*
FROM
TBL
MATCH_RECOGNIZE
(
PARTITION BY
a
ORDER BY
b
MEASURES
FINAL SUM(b) b1,
NULLIF(FINAL SUM(b), 0) b2
ALL ROWS PER MATCH WITH UNMATCHED ROWS
AFTER MATCH SKIP PAST LAST ROW
PATTERN
(C*)
DEFINE
C AS B > 0
) mr
结果:
| A | B | B1 | B2 |
|---|---|----|----|
| 1 | 1 | 10 | 20 |
| 1 | 2 | 10 | 20 |
| 1 | 3 | 10 | 20 |
| 1 | 4 | 10 | 20 |
解决方案
NULLIF
当我将其转换为逻辑等价物并且工作正常时,问题似乎出在CASE WHEN expr1 = expr 2 THEN NULL ELSE expr1 END
WITH TBL AS
(
SELECT 1 a, 1 b FROM DUAL UNION ALL
SELECT 1 a, 2 b FROM DUAL UNION ALL
SELECT 1 a, 3 b FROM DUAL UNION ALL
SELECT 1 a, 4 b FROM DUAL
)
SELECT
*
FROM
TBL
MATCH_RECOGNIZE
(
PARTITION BY
a
ORDER BY
b
MEASURES
FINAL SUM(b) b1,
CASE WHEN FINAL SUM(b)=0 THEN NULL ELSE FINAL SUM(b) END b2
ALL ROWS PER MATCH WITH UNMATCHED ROWS
AFTER MATCH SKIP PAST LAST ROW
PATTERN
(C*)
DEFINE
C AS B > 0
) mr
结果
| A | B | B1 | B2 |
|---|---|----|----|
| 1 | 1 | 10 | 10 |
| 1 | 2 | 10 | 10 |
| 1 | 3 | 10 | 10 |
| 1 | 4 | 10 | 10 |
推荐阅读
- amazon-web-services - OpenApi (Swagger) 与 AWS ECS 集成 - 公开所有操作
- r - sarprobit 包中的 sarorderedprobit 函数是否支持面板或时间序列数据集(在 r 内)?
- php - 有没有办法使用 Laravel Eloquent 管理 mysql 用户并在 MySQL 中获取数据库大小?
- var - 为什么不能在js中重新声明与let和var相同的变量名?
- java - HashMap 对象不会复制到另一个 HashMap 对象中
- sql - 如果 json_agg 什么也没找到,posgres 返回空行
- batch-file - 从用户给定的字符串中添加引号
- c++ - 在有向图中打印所有循环
- electron - electron-forge make 导致错误:找不到为“win32”平台配置的任何 make 目标
- julia - Julia Symbolics 中常量表示的 Sqrt