日期:2014-05-16  浏览次数:20696 次

又是一个有难度的问题
案例情况:
==========================================================
select * from t;

c1 c2 c3 c4
101 201006 5.00 100.00
101 201001 6.00 120.00
101 201003 7.00 180.00
102 201006 2.00 100.00
102 201001 8.00 120.00
102 200903 11.00 190.00
102 201005 3.00 130.00
102 201002 19.00 210.00

说明:t表有4000W+条数据
请用效率最高的sql语句取出
每个c1最小c2时的记录比如

c1 c2 c3 c4
101 201001        6.00 120.00
102 200903        11.00         190.00
==========================================================
本人水平有限,下面的语句报语法错误,说rule子句聚合函数用法不当
select c1,c2,c3,c4
from
(select /*+ parallel(a,4)*/
c1,c2,c3,c4
from t) b
model
return updated rows
partition by(c1)
dimension by (c2)
measures(c3,c4)
rules(c3[any]=c3[min(c2)],
c4[any]=c4[min(c2)]);

求高人指点
------最佳解决方案--------------------
需要这么复杂吗
又不涉及跨行引用
为什么要用model子句

直接用分析函数排下序就行
select *
from
(
select a.*,row_number() over(partition by c1 order by c2)rn 
from t
)
where rn=1
;
------其他解决方案--------------------
额 对啊
看来是我自己想复杂啦
------其他解决方案--------------------
如果一定要使用model子句的话应该怎么写呢
经测试,2楼提供方法的执行计划还可以,但由于有order by排序
效率依然有些影响
求正确的model子句写法