【Tips】獲取結果集中偶數行記錄

secooler發表於2010-02-07
如果您看過下面這篇文章,一定會對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 --


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-627000/,如需轉載,請註明出處,否則將追究法律責任。

相關文章