【Tips】获取结果集中偶数行记录

如果您看过下面这篇文章,一定会对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 --


请使用浏览器的分享功能分享到微信等