存储过程中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这样来写。在用户表(百万行数据)非常大的情况下,效率非常低。

请教下大家,这样的情况下,怎么解决这样的问题?谢谢!
...全文
582 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
补充下 用户表和分档的表数据示意如图中所示。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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