现在,我的数据的一张表中存了大约一千万条数据,格式如下:第0列 主键 第1列 区站号  第2列 站名 第3列 纬度  第4列 经度  第5列 台站高度  第6列 年  第7列 月  第8列 日  第9列 积雪深度 
问题:查询连续积雪日数大于X天的地区
我的思路是这样的:首先对区站号建立索引,然后利用游标对表进行操作,循环统计。但这样好像效率很低啊。求思路

解决方案 »

  1.   

    我是个菜鸟。
    我想从程序角度,给一个想法。
    如果你这个问题经常需要查询的话,可以添加一列累计积雪天数。
    当添加记录时,判断同一地区,上一天的积雪深度是否大于0,添加累计积雪天数。查询时,直接根据累计积雪天数,查询大于X天的地区 取distinct
      

  2.   

    用row_number()over()函数解决。
    表结构:Name      Type          Nullable Default Comments 
    --------- ------------- -------- ------- -------- 
    PK_ID     NUMBER(19)                              
    AREAID    VARCHAR2(200) Y                         
    SNOWDEPTH NUMBER(16,2)  Y                         
    SNOWDATE  DATE          Y   测试数据:insert into t_snowdata values(1,11,1.0,to_date('2012-01-01','yyyy-MM-dd'));
    insert into t_snowdata values(2,12,1.0,to_date('2012-01-01','yyyy-MM-dd'));
    insert into t_snowdata values(3,12,1.0,to_date('2012-01-02','yyyy-MM-dd'));
    insert into t_snowdata values(4,11,0.0,to_date('2012-01-02','yyyy-MM-dd'));
    insert into t_snowdata values(5,11,4.0,to_date('2012-01-03','yyyy-MM-dd'));
    insert into t_snowdata values(8,11,3.0,to_date('2012-01-04','yyyy-MM-dd'));
    insert into t_snowdata values(7,11,1.0,to_date('2012-01-06','yyyy-MM-dd'));
    insert into t_snowdata values(6,11,0.0,to_date('2012-01-05','yyyy-MM-dd'));SQL:select max(t2.num) maxNum,areaId from  (
      select count(diff) num,areaId from
        (select areaId,snowDate-row_number()over(partition by areaId order by snowDate asc) as diff from t_snowdata where snowDepth>0)t
         group by diff,areaId
    )t2
    group by areaId运行结果:
          maxNum   areaId
    1 2 11
    2 2 12