none
sql server 累计 RRS feed

  • 问题

  • 我有一张视图表数据(userproduct):

    userid              addtime             product1

    1001               2009-08-07          12

    1002               2009-08-08         15

    1001             2009-08-08           16

    .等等...

    我需要每一个用户每一次进货时的累计:我用如下方法实现

    select *,(select sum(b.product) from userproduct as b where b.userid=a.userid and b.addtime<=a.addtime)
    ) from userproduct as a

     

    可是效率太低,我的这张表的数量,大约有500万条左右。有没有高手,提高效率呀谢谢

    • 已移动 Sheng Jiang 蒋晟 2010年8月19日 16:21 (发件人:.NET Framework 一般性问题讨论区)
    2010年8月19日 15:03

答案

  • 但是他还有一个问题,就累计是今年添加的信息,往年不行,所以存储数据是计算好的是不行的。


    这是你在存储累计数据的时候, 如何制定累加规则而已, 为什么不行呢?

    比如说, 你用这样的规则:

    所有的数据累加的规则设置为: 上一条记录的值+本条记录

    而只累加今年的规则设置为: 上一条记录 and 上一条记录的年份与本条记录相同 + 本条记录

    • 已标记为答案 Mr Air 2010年8月24日 13:29
    2010年8月21日 4:29

全部回复

  • 我有一张视图表数据(userproduct):

    userid              addtime             product1

    1001               2009-08-07          12

    1002               2009-08-08         15

    1001             2009-08-08           16

    .等等...

    我需要每一个用户每一次进货时的累计:我用如下方法实现

    select *,(select sum(b.product) from userproduct as b where b.userid=a.userid and b.addtime<=a.addtime)
    ) from userproduct as a

     

    可是效率太低,我的这张表的数量,大约有500万条左右。有没有高手,提高效率呀谢谢

    2010年8月19日 15:05
  • 这种从效率上说应该是设计问题

    即时计算有数记录条数很多(500w)会导致性能很低

    2个解决办法:

    1.每次只查询特定用户(一个用户)这样可以减少查询数据量,来提高查询速度。

    2.增加一个累计字段,每次有进货,更新这个值,这样可以查询的时候直接查询这个字段,可以大大提高效率。带来的只是每次进货的时候多一点更新。

     


    family as water
    2010年8月20日 1:05
  • Oracle有这样累加的指令。。。但愿MSSQL下一版也加上

    现在SQL SERVER只能变通下处理,性能同样良好


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    • 已编辑 iDBApp 2010年8月24日 2:25
    2010年8月20日 4:27
  • 这种一般是在存储数据时就计算好, 而不是等到查询时去实时计算.

    或者,是根据业务变动情况, 确定一个业务不变动的时间段(比如一般不会改一个月之前的进货记录), 然后定期做期初结存, 这样只需要用期初结存+计算期初之后的累计.

    2010年8月20日 4:39
  • 使用存储过程就可以提高效率的,
    2010年8月20日 9:17
  • 但是他还有一个问题,就累计是今年添加的信息,往年不行,所以存储数据是计算好的是不行的。

    2010年8月21日 3:01
  • 但是他还有一个问题,就累计是今年添加的信息,往年不行,所以存储数据是计算好的是不行的。


    这是你在存储累计数据的时候, 如何制定累加规则而已, 为什么不行呢?

    比如说, 你用这样的规则:

    所有的数据累加的规则设置为: 上一条记录的值+本条记录

    而只累加今年的规则设置为: 上一条记录 and 上一条记录的年份与本条记录相同 + 本条记录

    • 已标记为答案 Mr Air 2010年8月24日 13:29
    2010年8月21日 4:29
  • 建议换个思路,再建一张统计用的表,每次进货(或者类似操作)时对统计表进行更新

    现在是500万条数据,将来可能上亿,10亿,无论怎么进行查询优化,估计收效甚微

    2010年8月23日 4:08
  • 但是每次录入数据时,都要对数据进行审核,所以录入时加累计,有点问题。

    还有如果某一个时间点的数据删除了,那这个时间点以后的数据都要相就的减,太麻烦了。

    还有我这个系统是改版的,数据库运行了一年多了,如果这样做,太麻烦了

    2010年8月24日 13:41