一个极其具有挑战性的问题!(1000分相送,不够再加)
一个极其具有挑战性的问题!(1000分相送,不够再加)
已知:有5种蛋糕,每种蛋糕每天的价格都有可能不相同,100个蛋糕店为这5种蛋糕提供价格。
提问:用何种方式知道某一段时间里面某种蛋糕的平均价最低的3个蛋糕店
提示:
可能的情况有:001号蛋糕店录入第1种蛋糕数据
蛋糕编号 价格 蛋糕店编号 时间段(按具体时间) 时间段(按周数)
001 5.2 098 2004-8-2,2004-8-3,2004-8-6
002 5.3 022 2004-9-9,2004-9-13,2004-10-6
001 5.7 031 2004-8-2,2004-9-1|5,6,7
001 5.9 016 2004-6-2,2004-12-1|5,6
001 5.2 051 2004-7-1
004 5.0 100 2004-8-2,2004-8-3,2004-8-6
001 5.2 078 2004-1-1,2004-12-31|5,6
001 5.2 051 2004-8-2,2004-8-3,2004-8-6,2004-8-7
时间短(按具体时间):就是可以录入具体某一天的时间,可以是30个日期或者更多
时间段(按周数) :就是根据某一个起止日期内的所有星期数
有什么办法知道以上数据在2004-8-1到2004-9-1这段时间内谁哪三个蛋糕店提供的价格(平均价)最低呢。目前已经知道如何去做,但是执行效率极其低下。
可以重新建立表,可以添加新的字段。
请各位不惜赐教。
msn: v2boy@msn.com
q q: 129071
问题点数:100、回复次数:11Top
1 楼chump(木人)回复于 2004-09-02 09:22:31 得分 100
提供一个思路:
1:以数据仓库的方式来解决,即以维度方式建模;
2:考虑维表:
蛋糕维表:蛋糕ID,蛋糕名称,etc.
时间维表:时间id,年、季度、月、日、周、etc.
蛋糕店表:蛋糕店id, 名称,etc.
蛋糕价格事实表:时间id,蛋糕店id,蛋糕ID,价格,etc.
3:以数据库的方式来查询,如使用avg函数,效率可能差一些;
4:使用多维模型,建立蛋糕价格多维数据集;
使用mdx查询。
5:时间维度考虑:
年、季度、月、周的聚集方式为:每日的平均值
这样如果查询年、季度、月、周的平均价格则可以直接使用聚集了;
任意时间段平均:
使用这样的方式:with member [Time].[2004.1.8--2004.5.13] as 'avg([Time].[2004].[Q1].[1].[8]:[Time].[2004].[Q2].[5].[13])'
6:使用MDX函数Order排序,使用TopCount返回前几位。
Top
2 楼v2boy(大格)回复于 2004-09-02 09:36:50 得分 0
Re:谢谢chump(木人) ( ) 信誉:100 的回复
日期字段是一个时间段,或者一个时间段里面的所有星期一或者任一一个星期X
忘记说了,表结构不能修改。否则整个系统会重做
如果有10000种产品,1年365天,1000个供应商提供每天的价格。如果(日期放一个字段),数据库里面就会有 10000X365X1000 = 3650000000
那数据库里面,光价格就有36亿条记录,估计要老板要把数据库换大型机才能跑。
而上面我说的情况是有的。
感谢chump(木人)的思路,能否再具体一点。
Top
3 楼chump(木人)回复于 2004-09-02 09:50:18 得分 0
1:你的时间段意思是不是这样?
比如:2004-9-9,2004-9-13,2004-10-6
表示2004-9-9,2004-9-13(小于)是一个价格;
而2004-9-13,2004-10-6(小于)又是一个价格?
每个日期实际是价格改变的日期?
2:如果表结构不能修改,则即使能查询,效率也非常非常差!!
3:建议考虑以增加字段的方式处理!
Top
4 楼v2boy(大格)回复于 2004-09-02 09:53:31 得分 0
2004-9-9,2004-9-13,2004-10-6
的意思是表示3天时间。
请问如何增加字段。Top
5 楼v2boy(大格)回复于 2004-09-02 10:00:12 得分 0
时间段的日期2004-8-2,2004-8-3,2004-8-6表示这三天
周数表示:2004-8-2,2004-9-1|5,6,7 这一段时间2004-8-2到2004-9-1的所有星期5、6、日Top
6 楼aaronwu()回复于 2004-09-02 10:10:28 得分 0
需要统计的时间段是任意的呢?还是固定的,比如说一个月、一周?Top
7 楼chump(木人)回复于 2004-09-02 11:01:01 得分 0
1:明白了!实际上你是为了满足界面的输入而把表结构设计成这样!!其实完全没有必要这样设计!!为统计查询造成很大的困难(几乎不可能)。
2:时间段(按具体时间)和时间段(按周数)根本就不用分开!!
两者表示法又不同!
时间段的日期2004-8-2,2004-8-3,2004-8-6表示这三天;具体时间,非段
周数表示:2004-8-2,2004-9-1|5,6,7这一段时间2004-8-2到2004-9-1的所有星期5、6、日;不仅表示时间段,而且表示其中的N天!!
其实这些处理可以在显示的时候表示,而没必要数据库中表示成这样!!!
3:所以,按照数据仓库的处理方法,日期可能要分开的!!单独成字段!
4:如果有10000种产品,1年365天,1000个供应商提供每天的价格。如果(日期放一个字段),数据库里面就会有 10000X365X1000 = 3650000000
这种情况当然会存在,并且也能很好的处理的!!大型数据仓库,非常有这个可能的。
一般都会物理分区,并且数据的粒度不会这么明细的,比如只保存最近3个月的明细数据,历史数据按月聚集!!
看一下银行客户每月余额的数据,够吓人吧!
Top
8 楼v2boy(大格)回复于 2004-09-02 20:33:45 得分 0
各位大哥,给个建议,如果在不破坏现在的数据结构和程序的情况下,我该如何做。
Top
9 楼aaronwu()回复于 2004-09-02 21:38:35 得分 0
chump(木人) 说的没错,你可以考虑数据仓库的时间不是按天来保存,而是按周、按月来保存,这样数据量会少很多!
呵呵呵,我做过银行,就是按月保存的,差不多有2亿条记录Top
10 楼v2boy(大格)回复于 2004-09-03 11:17:29 得分 0
非常感谢各位大大:基本上已经定为各位大大提供的三种意见
思路是这样的
1、首先,不修改目前数据表结果,新建一个表做为存放价格数据的临时表,主要是把日期格式化一下便于索引和统计
2、该表只能存放当天之后30天的数据记录
3、数据录入程序仍然按照以前的,然后在该数据录入的程序中添加一个 处理过程。(该过程:将当前价格信息格式化之后存放到刚才建立的临时表中)
4、查询和统计使用临时表,临时表中的小于当天的历史数据需要每天执行一个程序删除。
这种思路来源于
chump(木人)
http://community.csdn.net/Expert/topic/3331/3331690.xml?temp=.5929376
zjcxc(邹建) txlicenhe(马可)
http://community.csdn.net/Expert/topic/3331/3331687.xml?temp=.4018824
可惜我对维度不熟悉
另外有
windindance(风舞轻扬) ( ) liufuyahong() ( )
http://community.csdn.net/Expert/topic/3331/3331696.xml?temp=4.078311E-02
crankfe(crank)
http://community.csdn.net/Expert/topic/3331/3331688.xml?temp=.3809473
还有一下大大的我看的不是很懂,看上去好像非常不错
qimini(循序渐进) ( ) 信誉:106
http://community.csdn.net/Expert/topic/3331/3331688.xml?temp=.3809473
希望大大们综合一下,最终搞个结论出来,今天结贴。综合的好的,每人1000分。其余各献计献策的都有分送。谢谢各位的支持。
另外,惨痛的教训就是廉价的程序员和DBA会导致系统要用数百倍的价格来补偿。
Top
11 楼pae(致力与数据分析工作)回复于 2004-09-05 23:08:56 得分 0
这应该是零售业数据仓库项目中比较典型的问题,类似的还有某品牌商品不同时间段销售额的销售额和总销售额的占比、某段时间某地区某品牌的价格波动以及和相关范围内总体价格波动的占比等,看楼主最后总结的方案似乎是做一个业务系统,只需要最近一个月的数据,如果这样的话,数据量应该不大,处理起来比较容易,但如果你打算做成一个分析报表,需要至少全年的数据,甚至多年的数据,可以把你的系统架构介绍一下,我们讨论。
另外,可以想到的是,如果客户提出更多的需求,比如上面举的例子,你现在的方案是否可以类推解决?Top




