有一张表,数据摘取如下
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相同);问题:这个表数据量有几十万条数据,没有索引,并且步骤一获取的数据量有可能也很大.这样查询的效率很差.
有没有更好的方法? 谢谢...
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.先取符合VAL >=4000的DISTINCT FREQ 然后用NOT EXISTS 试试
select /*+ parallel(c1 ,2) */ *
from
--这样行不?
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
--上面分组写错了
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
where a.val<4000
not exists(select 1 from tb b where a.FREQ=b.FREQ and a.val<b.val)