如何对这张表统计?? 急!!!(200分)

  • 主题发起人 主题发起人 xingxing3
  • 开始时间 开始时间
X

xingxing3

Unregistered / Unconfirmed
GUEST, unregistred user!
一张客户定单表,主要字段如下(均建有索引):
order_id(订单号),order_time(下单时间),customer_id(客户id)
一个客户可以有多条下单记录。
订单表会定期将前一天的记录迁移到订单历史表(与订单表结构相同)中。
要求:统计任一时间段(精度为天,时间段可能跨越两张表)customer_id数。

因为记录数很大,所以不能直接去表里统计,希望能做个中间表,统计时对中间表操作,
将 customer_id 数统计出来。
我该怎么做呢?
 
1.
create view oall as
select * from otoday
union all
select * from ohistory
2.select Customer_id,count(*) from oall
where order_time between :d1 and :d2
group by Customer_id
 
我来晚了吗
 
我怀疑arm的方法在实际操作时的性能。
以前搞MIS时经常有这种需要,刚开始时就用arm所说的方法,
但服务器总是先生成一个临时表,再统计。这样数据量大后,经常报TempDB溢出,速度也慢。
后来改成使用存储过程,效果就很好。
存储过程的步骤如下:
先按输出结果的要求创建一个临时表,
分别把不同表的统计结果存入这张临时表,
输出临时表或再统计该临时表。
 
假如资料很多,最好还是用存储过程的方法要好一些。不知你是什么数据库啦。
 
我觉得你应该优化索引,在order_time字段上建聚类索引
 
其实只用一张表就可以解决问题:
SELECT COUNT(customer_id)
FROM table1
WHERE order_time BETWEEN :d1 AND :d2
GROUP BY CONVERT( CHAR(10), order_time, 10 )
 
arm 的方法我想是不行的。。
addie 的方法我想也不是很好,因为我现在只用一张表就已经很慢了。。

我用的是oracle 8.05
因为表的记录太多,每天都会有上万条记录生成,所以统计起来很耗时。
我原来的办法是
只用一张表,累计了六,七十万条记录,每次统计用下面的sql语句
SELECT DISTINCT(Customer_id)
FROM T_OrderBill
WHERE Ordertime>=v_BeginTime
AND Ordertime< v_EndTime
GROUP BY Cus_Type
再加上用了distinct和group by语句,使结果返回时间很长。
所以这次想建一个历史表,把每天的记录迁移到历史表中,在迁移数据之前,对当天
这些记录进行统计放到一个日结表中。以后就查询就从日结表中来做。
一个典型的日结表形式可能如下:
Time Cus_Type Cus_Order_Num Product_Num Cus_Num
------------------- --------- ------------- ----------- -------
2000/01/01 23:00:00 Large 356 40078
2000/01/01 23:00:00 Small 778 2345
2000/01/02 23:00:00 Large 247 32455
但用这样的方法Cus_Num就无法统计。虽然每天都有统计客户数,但简单的将两天
的客户数相加并不等于实际两天内下单的客户数(会有重复)。
用什么方法好呢?还是采用这种日结方法用个什么算法将结果算出来?
我曾经想用集合论的方法试一下,不料却发现这些理论东西全还给老师了:(
 
大家没有兴趣吗?还是我太罗嗦了??
 
商业领域关于这类问题有一些解决办法。
利群商厦每天的销售记录几十几百万,他们有一个“日月数据明细表”,
和一个“周数据统计表”和“月数据统计表”。
同时他们的所有明细表设计得非常完美,专门针对速度设计的,并定时清空、备份。
注意:
1)太细的历史数据无必要存在;
2)金字塔的高度直接影响到它的占地面积。
 
多人接受答案了。
 

Similar threads

后退
顶部