有一个大的分区表,大致有六百万条记录,并且每天以一万多条左右的速度增长.
表的部分结构如下:
rdate date;--发生日期
account char;--编号
money number(12,2);--发生金额
其余字段省略....每个编号在当天不一定产生记录.
如何用最佳的方法找出连续10天发生交易的记录?

解决方案 »

  1.   

    http://blog.csdn.net/zhpsam109/archive/2004/09/07/97376.aspx借助最后一个sql和 rdate date;--发生日期 字段来关联就可以实现了!
      

  2.   

    假设1个编号1天只产生1条记录,并且存在有5天以上连续的编号SQL> select * from a;ACCOUNT    RDATE
    ---------- -----------
    101        2005-7-1
    101        2005-7-2
    101        2005-7-3
    101        2005-7-4
    101        2005-7-5
    101        2005-7-7
    101        2005-7-8
    101        2005-7-9
    101        2005-7-10
    101        2005-7-11
    101        2005-7-12
    101        2005-7-13
    102        2005-7-14
    102        2005-7-15
    102        2005-7-16
    102        2005-7-12
    102        2005-7-24
    102        2005-7-31
    102        2005-7-26
    102        2005-7-30ACCOUNT    RDATE
    ---------- -----------
    102        2005-7-22
    102        2005-7-17
    102        2005-7-18
    102        2005-7-19
    102        2005-7-20
    102        2005-7-21
    102        2005-7-23
    103        2005-7-25
    103        2005-7-27
    103        2005-7-2830 rows selectedselect distinct account from 
           (select a.*,
                   rdate - row_number() over(partition by account order by rdate) part 
           from a)
    group by account,part
    having count(*) >=5SQL> 
      7  /ACCOUNT
    ----------
    101
    102SQL>
      

  3.   

    "1个编号1天有可能发生多条记录"
    你可以用DISTINCT解决这个问题“有什么比较快的方法吗?”
    建议建立辅助表
      

  4.   

    1个编号1天有可能发生多条记录的情况:select distinct account from 
           (select a.*,
                   rdate - dense_rank() over(partition by account order by rdate) part 
           from a)
    group by account,part
    having max(rdate) - min(rdate) >= 4
      

  5.   

    --> 最近10天
    select account 
    where rdate>=sysdate-10   --> 最近20天-最近10天 
    select account 
    where sysdate-10>=rdate>=sysdate-20   ....
      

  6.   

    --> 最近10天,更精确点:
    select account 
    where to_char(rdate,'YYYYMMDD')>=to_char(sysdate-10,'YYYYMMDD')