有一张表,数据摘取如下
NO  NAME       FREQ         Time            VAL  
1   中心站     108000000    200905          121  
2   中心站     108000000    200907     4500  
3   中心站     108025000    200905     48  
4   中心站     108025000    200907     2521
.......需求:相同的点(FREQ)中只要有一个月份时间(TIME)符合这个条件(如:VAL >=4000) 表中的这个FREQ 的所有记录都要过滤掉;
得到结果如下:
NO  NAME        FREQ       Time         VAL  
1   中心站   108025000  200905      48  
2   中心站   108025000  200907      2521 目前的解决方案:
1.忽略月份时间 按FREQ 分组 获取分组中最大的值(VAL)小于 限定值的数据,数据如下;
 FREQ            VAL 
 108025000  2521
2.在表中获取只存在这个结果集的记录(FREQ相同);问题:这个表数据量有几十万条数据,没有索引,并且步骤一获取的数据量有可能也很大.这样查询的效率很差.
有没有更好的方法?   谢谢...

解决方案 »

  1.   


    反向思考下,
    1.先取符合VAL >=4000的DISTINCT FREQ 然后用NOT EXISTS 试试
      

  2.   

    加并行查询 
    select  /*+ parallel(c1 ,2) */      *
        from 
      

  3.   


    --这样行不?
    SELECT NO, NAME, FREQ, TIME, VAL FROM (
      SELECT NO, NAME, FREQ, TIME, VAL,
      Sum(CASE WHEN val>=4000 THEN 1 ELSE 0 END)over(PARTITION BY  NO, NAME, FREQ) flag
      FROM tab
    )
    WHERE flag!=0
      

  4.   


    --上面分组写错了 
    SELECT NO, NAME, FREQ, TIME, VAL FROM (
      SELECT NO, NAME, FREQ, TIME, VAL,
      Sum(CASE WHEN val>=4000 THEN 1 ELSE 0 END)over(PARTITION BY FREQ) flag  --关键这里
      FROM tab
    )
    WHERE flag!=0
      

  5.   

    ---如果服务器的cpu 以及内存空闲大可以开并行  n为你CPU个数select /*+ parallel(a,n) */ FREQ,VAL from tb a 
    where a.val<4000
    not exists(select 1 from tb b where a.FREQ=b.FREQ and a.val<b.val)