如果您看过下面这篇文章,一定会对ROW_NUMBER分析函数产生些许感情,其实ROW_NUMBER分析函数还可以给我们带来更多的乐趣。
《【SQL】获取指定范围内结果集的实现方法》
http://space.itpub.net/519536/viewspace-626976
这篇文章我给大家展示一下使用ROW_NUMBER分析函数得到偶数行数据的方法。
1.T表内容
sec@ora10g> select * from t;
ID SAL
---------- ----------
1 1000
2 800
3 600
4 2000
5 3000
6 1500
7 1800
8 2100
9 400
10 600
11 200
12 1900
13 3000
14 4000
14 rows selected.
2.提问
如何得到按照id排序后偶数id的信息?
3.回答
1)使用ROW_NUMBER分析函数快速完成任务
sec@ora10g> select id, sal
2 from (select id, sal, ROW_NUMBER () over (order by id) as rn
3 from t)
4 where mod(rn,2) = 0
5 /
ID SAL
---------- ----------
2 800
4 2000
6 1500
8 2100
10 600
12 1900
14 4000
7 rows selected.
2)“更简便的方法”
您可能会问,不用那么复杂,直接在id字段上使用mod函数不也同样可以得到我们想要的结果么?
sec@ora10g> select id, sal from t where mod(id,2) = 0;
ID SAL
---------- ----------
2 800
4 2000
6 1500
8 2100
10 600
12 1900
14 4000
7 rows selected.
恭喜你,答对啦。完全正确。
不过这种方法只适用与这个需求,换一种需求再试试看。
4.再提问
如何得到按照sal排序后偶数行的信息?
5.再回答
1)再次使用ROW_NUMBER分析函数快速完成任务
sec@ora10g> select id, sal
2 from (select id, sal, ROW_NUMBER () over (order by sal) as rn
3 from t)
4 where mod(rn,2) = 0
5 /
ID SAL
---------- ----------
9 400
10 600
1 1000
7 1800
4 2000
5 3000
14 4000
7 rows selected.
2)此时如果使用普通查询方法将不再方便
使用子查询和rownum构造这个结果,显然比较复杂。
sec@ora10g> select t1.id, t1.sal
2 from (select ROWNUM rnum, id, sal
3 from (select id, sal
4 from t
5 order by sal)) t1
6 where MOD (t1.rnum, 2) = 0;
ID SAL
---------- ----------
9 400
10 600
1 1000
7 1800
4 2000
5 3000
14 4000
7 rows selected.
6.小结
随着需求的复杂度加大,使用普通查询方法的代价越高。慢慢感受分析函数带给我们的便利吧。
珍爱生命,请远离繁琐低效的SQL语句。
Good luck.
secooler
10.02.07
-- The End --