存储过程中CASE WHEN的替代语句

ck032 2013-07-08 04:35:21
现在有一个字段分档的问题,请教下大家,看看怎么解决好。

我有一个用户表,包含user_id和很多指标。比如FLD1,N1M_FLD1(下个月的),N2M_FLD1(下下个月),FLD2,N1M_FLD2,N2M_FLD2等等几十个指标。

现在给定指标的上限、下限。比如FLD1=12,下限是10,上限是20,那么FLD1则被分到(10,20]这一档。
同理,N1M_FLD1、N2M_FLD1也是根据10、20这样上下限来进行分档;

每个指标的可能被分成多档。

以前的做法是写很多case when语句来判断。但是指标数太多,而且分档区间经常变动的话,程序就需要经常修改。

我自己尝试了做一个码表,用FLD1>MIN_FILED AND FLD1<MAX_FILED这样来写。在用户表(百万行数据)非常大的情况下,效率非常低。

请教下大家,这样的情况下,怎么解决这样的问题?谢谢!
...全文
388 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
shy315 2013-07-09
索引肯定比case慢些,虽然数量级一样,但多了的话,就是好几倍。 能不能建function
回复
ck032 2013-07-09

SELECT 
p1.user_id,
p1.arpu,
p2.FLD_LVL_DESC AS ARPU_LVL ,
p1.ROI,
p3.FLD_LVL_DESC AS ROI_LVL 
FROM ck_tmp_test p1
,TMP_CK_FLD_DESC p2,
TMP_CK_FLD_DESC p3
WHERE (P2.FLD_NAME='ARPU' and P2.min_fld<arpu and arpu<=P2.max_fld)   
AND (P3.FLD_NAME='ROI' and P3.min_fld<ROI and ROI<=P3.max_fld) 
上面是现在用的代码,不过这样的话,效率不是很好。因为用户表p1非常大,而且分档字段有几十个,TMP_CK_FLD_DESC表要重复几十遍来获取字段的分档区间。用户表p1,在user_id上是有索引的。
回复
ck032 2013-07-09
@shy315 :想要的结果如上所示。 索引在FLD,MIN_FLD,MAX_FLD上面都已经建了。 因为只是想得到结果,所以码表形式上可以改。但是如果把码表横过来,似乎也不太合适,因为这样的话字段数是不定的。 @ccs02287 :现在没有求汇总,只是做一个映射。
回复
shy315 2013-07-08
几百万,索引合适的话,应该不会差太多,楼主没说明要什么样的结果。
回复
空心兜兜 2013-07-08
十几个指标…………那就不如不转了,直接Group by
回复
ck032 2013-07-08
补充下 用户表和分档的表数据示意如图中所示。
回复
相关推荐
发帖
Oracle
创建于2007-09-28

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2013-07-08 04:35
社区公告
暂无公告