Oracle使用MAX(decode)存在BUG?

MARKtft 2012-08-29 09:52:20
大家好!有个问题请教大家。利用max(decode)处理行转列

建表语句如下:
create table XX_PC_INJ_COMPLETION_DAILY_T
(
WELL_ID VARCHAR2(10) not null,
INJ_DATE DATE not null,
COMPLETION_ID VARCHAR2(10) not null,
PROPERTY_ID VARCHAR2(5),
CHOKE_SIZE NVARCHAR2(20),
INTERVAL_ALLOC_INJ_WATER_DAILY NUMBER,
INJ_VOL_DAILY NUMBER,
COMPLETION_NUMBER NUMBER
)

max(decode) SQL 如下:
select
well_id,
inj_date,
max(decode(completion_number,1,inj_vol_daily )) inj_vol_daily1,
max(decode(completion_number,1,interval_alloc_inj_water_daily )) alloc_inj_vol_daily1,
max(decode(completion_number,2,inj_vol_daily )) inj_vol_daily2,
max(decode(completion_number,2,interval_alloc_inj_water_daily )) alloc_inj_vol_daily2
...
from
xx_pc_inj_completion_daily_t
group by well_id,inj_date


问题如下:
个别记录行转列失效.
举例源表select .. from xx_pc_inj_completion_daily_t
where well_id = 'kGoWjgknhb' and completion_number=1 存在记录.
但max(decode)的结果不存在completion_number等于1的列.
源表记录:
[code=SQL]
WELL_ID INJ_DATE INTERVAL_ALLOC_INJ_WATER_DAILY INJ_VOL_DAILY COMPLETION_NUMBER
kGoWjgknhb 2011-1-1 20 18 4
kGoWjgknhb 2011-1-1 60 18 1
kGoWjgknhb 2011-1-1 50 9 3
kGoWjgknhb 2011-1-1 35 17 2
/code]

Max(decode)结果:
[code=SQL]
WELL_ID INJ_DATE INTERVAL_ALLOC_INJ_WATER_DAILY1 INJ_VOL_DAILY1 INTERVAL_ALLOC_INJ_WATER_DAILY2 INJ_VOL_DAILY2
kGoWjgknhb 2011-1-1 35 17
/code]

如果对源表增加过滤条件,max(decode)正常。
select
well_id,
inj_date,
max(decode(completion_number,1,inj_vol_daily )) inj_vol_daily1,
max(decode(completion_number,1,interval_alloc_inj_water_daily )) alloc_inj_vol_daily1,
max(decode(completion_number,2,inj_vol_daily )) inj_vol_daily2,
max(decode(completion_number,2,interval_alloc_inj_water_daily )) alloc_inj_vol_daily2
...
from
xx_pc_inj_completion_daily_t
where well_id = 'kGoWjgknhb'
group by well_id,inj_date

查询出的结果completion_number等于1的列存在。
[code=SQL]
WELL_ID INJ_DATE INTERVAL_ALLOC_INJ_WATER_DAILY1 INJ_VOL_DAILY1 INTERVAL_ALLOC_INJ_WATER_DAILY2 INJ_VOL_DAILY2
kGoWjgknhb 2011-1-1 60 18 35 17
/code]


我怀疑可能有以下原因导致,请大家帮助:
1、表数据量太多,导致MAX(DECODE)出问题。 该表有500W行记录
2、表的completion_number列存在空
3、一个well_id、inj_date分区内,completion_number存在重复
例如:
WELL_ID INJ_DATE completion_number
kGoWjgknhb 2011-5-1 ... 1
kGoWjgknhb 2011-5-1 ... 1


...全文
452 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdsnhan 2012-09-02
  • 打赏
  • 举报
回复
即使completion_number存在问题,他求的也是inj_vol_daily的最大啊
MARKtft 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

我觉得bug可能性不大,还是在数据层上有问题。
你可以看看加上well_id = 'kGoWjgknhb'这个条件过,过滤掉哪些数据,尤其是涉及到空的
[/Quote]

感谢关注:
1、将所有空的记录删除后,还存在此问题。
2、正在测试 一个well_id、inj_date分区内,completion_number存在重复 的问题。
jdsnhan 2012-08-29
  • 打赏
  • 举报
回复
我觉得bug可能性不大,还是在数据层上有问题。
你可以看看加上well_id = 'kGoWjgknhb'这个条件过,过滤掉哪些数据,尤其是涉及到空的

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧