一个极其具有挑战性的问题!(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、回复次数:15Top
1 楼rcaicc(√(没完没了))回复于 2004-09-02 07:09:43 得分 0
呵呵~不懂了..Top
2 楼Frend(一刀)回复于 2004-09-02 08:15:43 得分 0
用查找啦。Top
3 楼windindance(风舞轻扬·白首为功名)回复于 2004-09-02 08:30:15 得分 0
首先重建表结构(或建立临时表),表结构为:
蛋糕编号 价格 蛋糕店编号 时间
其中,每一天,每种蛋糕,每个蛋糕店的价格是一条记录。
然后
select top 3
蛋糕店编号, avg(价格)
from t
where 时间 between '2004-8-1' and '2004-9-1'
group by 蛋糕店编号
order by avg(价格)
你的分的确够多了,连续发了10几个帖子吧?有必要吗?Top
4 楼liufuyahong()回复于 2004-09-02 08:37:10 得分 10
create table cake_price
(
cake_no varchar(3),
price numeric(5,2),
cake_store_no varchar(3),
price_date datetime
)
insert into cake_price values('001',5.2,'098','2004-8-2')
insert into cake_price values('001',5.2,'098','2004-8-3')
insert into cake_price values('001',5.2,'098','2004-8-6')
insert into cake_price values('002',5.3,'022','2004-9-9')
insert into cake_price values('002',5.3,'022','2004-9-13')
insert into cake_price values('002',5.3,'022','2004-10-6')
insert into cake_price values('001',5.7,'031','2004-8-2')
select top 3 cake_store_no,cake_no,avg(price) as avg_price
from cake_price
where price_date>='2004-8-1'
and price_date<='2004-9-1'
group by cake_store_no,
cake_no
order by cake_store_no,
cake_noTop
5 楼yinweixian(blackyin)回复于 2004-09-02 08:45:39 得分 0
支持楼上的 liufuyahong()Top
6 楼v2boy(大格)回复于 2004-09-02 09:31:44 得分 0
日期字段是一个时间段,或者一个时间段里面的所有星期一或者任一一个星期?
谢谢:windindance(风舞轻扬)liufuyahong() ( ) 信誉:100 的回复
忘记说了,表结构不能修改。否则整个系统会重做。2000多个ASP程序啊,老大们!~!
如果有10000种产品,1年365天,1000个供应商提供每天的价格。如果按照各位老大的方法(日期放一个字段),数据库里面就会有 10000X365X1000 = 3650000000
那数据库里面,光价格就有36亿条记录,估计要老板要把数据库换大型机才能跑。
而上面我说的情况是有的。
Top
7 楼windindance(风舞轻扬·白首为功名)回复于 2004-09-02 09:59:21 得分 90
to v2boy:
用临时表或者表变量啊。
你不需要一次性把所有的数据全部列出,只要列出你要用到的不就可以了?
那可以用这样的方法:
declare @temp table (编号 varchar(10), 总价格 numeric(18,2), 天数 int)
然后对你原始表中的每条数据进行处理,把价格加到@temp临时表中去。Top
8 楼v2boy(大格)回复于 2004-09-02 10:03:54 得分 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
9 楼jiang5460(巴山夜雨)回复于 2004-09-02 10:14:37 得分 0
select top 3
蛋糕店编号, avg(价格) from 表
where 时间段 between 'startdata' and 'enddata'
group by 蛋糕店编号
order by avg(价格) DEsc
Top
10 楼liufuyahong()回复于 2004-09-02 12:59:11 得分 0
如果不转换原来的结构,则很难统计。
关于记录的问题,可以用分月或分季的方法来处理。
这个问题,建议最好到数据库版去问问。Top
11 楼Jeff20040819(美丽)回复于 2004-09-02 17:33:09 得分 0
学习,接分Top
12 楼v2boy(大格)回复于 2004-09-03 11:23:06 得分 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
13 楼leanxj(孤星)回复于 2004-09-03 11:35:03 得分 0
你让各个蛋糕店上报平均价格就可以了嘛,何必要统一收集数据来让服务器处理呢,让客户端机器也分担一些嘛,就是让客户端机器计算各蛋糕的平均价格,然后你在服务器端处理起来就快多了,这个模式很好哦!介于c/s 和b/s之间哦Top
14 楼wcmstars(wcm_stars)回复于 2004-09-03 12:22:17 得分 0
支持Top
15 楼shyghostwolf(土的掉渣)回复于 2004-09-03 12:38:01 得分 0
http://community.csdn.net/Expert/topic/3331/3331688.xml?temp=.3809473Top




