12
返回列表 发新帖
楼主: 蕲喻

[讨论] 根据组合情况,对值的占比进行重新分配

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2017-8-18 17:03 | 只看该作者
〇〇 发表于 2017-8-18 16:28
with t as(select 4 a,0.5 b union select 2,0.3 union select 1,0.2)
,r(n) as(select 1 union all selec ...

太厉害了,你这个完美解决问题! 跟预期完全一样:

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2017-8-18 17:16 | 只看该作者
上传部分实际数据,并把我处理的笨方法说一下:
create table T_PRICE
(
  ID     NUMBER(2),
  WEIGHT NUMBER(5,2),
  PRICE  NUMBER(3,2),
  PLEVEL NUMBER(2)
);

这张表是要处理的,先根据单价高低划分5,3,2三个类别,记录在plevel字段。下面是处理代码:

--对不同id包含的单价类别进行编码
insert into tmp_plevel(id, cbc)
with c_price as (
  select distinct id, case when price < 0.14 then 2 when price <= 0.17 then 30 else 500 end cbc   --这里cbc跟plevel的规则一样,只不过做了放大处理
    from t_price)
select id, sum(cbc) cbc
  from c_price
group by id;

--占比重新分配
--530  ->  73
update t_price h
   set plevel = 7
where plevel = 5
   and exists(select 1 from tmp_plevel p
               where h.id = p.id
                 and p.cbc = 530);
                 
--502  ->  82 |  32  ->  82
update t_price h
   set plevel = 8
where plevel > 2
   and exists(select 1 from tmp_plevel p
               where h.id = p.id
                 and p.cbc in (502, 32));
                 
--500  ->  10 |  30  ->  10 | 2 -> 10
update t_price h
   set plevel = 10
where exists(select 1 from tmp_plevel p
               where h.id = p.id
                 and p.cbc <> 32
                 and p.cbc < 501);

最后plevel/10就是重新分配的占比。

t_price.sql

2.89 KB, 阅读权限: 20, 下载次数: 1

data

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
13#
发表于 2017-8-18 21:20 | 只看该作者
with t as(select 0.3 b, 4 lvl from dual union select 0.2, 3 from dual union select 0.1, 2 from dual union select 0.4,1 from dual )
,t2 as (select power(2,row_number() over(order by lvl desc)-1) bit,b,lvl from t)
select n,lvl,decode(rn,1,b+s,b)
  from (
select n
      ,t2.b
      ,t2.lvl
      ,nvl(sum(case when bitand(n,bit)=0 then b end) over(partition by n),0) s
      ,bitand(n,bit) flag
      ,row_number() over(partition by n order by case when bitand(n,bit)>0 then t2.lvl end desc nulls last) rn
  from (select level n from dual connect by level<=(select power(2,count(*))-1 from t))
      ,t2
      )
where flag>0;
      

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
14#
发表于 2017-8-19 08:18 来自手机 | 只看该作者
我也想到用分析函数,但不会写

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表