需求:今天总裁办提出了一个需求,按品牌进行价格分段。例如:海尔品牌的一种型号电视为3000元,而另外一种型号为3200。那么按3000-3002,3002-3004,3004-3006……3198-3200的标准进行价格分段,求每段价格的订单数,销售金额等等指标。供他们查看在哪一种价格段的商品卖得更好。
建立模型如下:
按价格段进行分段,间隔为2.
创建表:
create table tmp (TID int,MinPrice int,MaxPrice int)
insert into tmp values(1,70,80);
insert into tmp values(2,60,90)
则数据如下:
select * from tmp;
算法如下:
(1)建立间隔为2的模型:
select * from (select level lvl from dual connect by level<=30) where mod(lvl,2)=0
这里面的30代表是每一行中跨度之间的最大值。而mod(lvl,2)表示的是间隔为2.
建立间隔为2的模型也可以用如下方法:
SELECT *
FROM (SELECT rownum lvl FROM dual CONNECT BY rownum <= 30) t
WHERE MOD(lvl, 2) = 0
(2) 与表tmp进行笛卡尔积:
select t.tid,t.minprice+t1.lvl,t.minprice+t1.lvl+2 from tmp t
inner join (select * from (select level lvl from dual connect by level<=30) where mod(lvl,2)=0 )t1
on 1=1
order by 1,2
结果如下:
(3) 进行排序筛选:( 筛选条件:t.minprice+t1.lvl + 2 - t.maxprice < 2)
select t.tid,t.minprice+t1.lvl,t.minprice+t1.lvl+2 from tmp t
inner join (select * from (select level lvl from dual connect by level<=30) where mod(lvl,2)=0 )t1
on 1=1
where t.minprice+t1.lvl + 2 - t.maxprice < 2
ORDER BY 1,2;
总结:这个方案能实现这个需求,但是最后考虑到公司的数据量太大,太大,加上中间采用了笛卡尔积,而且每个品牌下面的价格跨度也很大,所以最终没有实现。但是这个模型对于数据量小来说是比较好的模型。
原文地址:http://www.cnblogs.com/HeiSe2014/p/3804190.html