<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    紙飛機

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      22 隨筆 :: 28 文章 :: 30 評論 :: 0 Trackbacks

    問題:查找某個列中值的模式(數學中的模式概念就是對于給定的數據集出現最頻繁的元素)。例如,查找DEPTNO 20中工資的模式。例如下列工資:

    select sal

       from emp

    where deptno = 20

    order by sal

            SAL

    ----------

            800

           1100

           2975

           3000

           3000

    the mode is 3000.

    解決方案

    DB2和SQL Server

    使用窗口函數DENSE_RANK,把工資重復出現次數分等級,以便提取模式:

    1   select sal

    2     from (

    3   select sal,

    4          dense_rank()over(order by cnt desc) as rnk

    5     from (

    6   select sal, count(*) as cnt

    8     from emp

    9    where deptno = 20

    10    group by sal

    11          ) x

    12          ) y

    13    where rnk = 1

    Oracle

    在Oracle8i Database中,可以使用DB2給出的解決方案。對于Oracle9i及更高版本,可以用聚集函數MAX的KEEP擴展,以得到SAL模式。特別要注意的是,如果存在綁帶,也即多個行都是模式,則采用KEEP方案僅能得到一個,即其中工資最高的那個。如果想要看所有模式(如果存在多個模式),則必須修改該方案,或者簡單地使用前面介紹的DB2解決方案。在這個例子中,由于3000是DEPTNO 20中SAL的模式,而且它也是最高的SAL,因此以下方案就可以了:

    1   select max(sal)

    2           keep(dense_rank first order by cnt desc) sal

    3     from (

    4   select sal, count(*) cnt

    5     from emp

    6    where deptno=20

    7    group by sal

    8          )

    MySQL和PostgreSQL

    使用子查詢查找模式:

    1   select sal

    2     from emp

    3    where deptno = 20

    4    group by sal

    5   having count(*) >= all ( select count(*)  

    6                              from emp

    7                             where deptno = 20

    8                             group by sal )

    討論

    DB2和SQL Server

    內聯視圖X將返回每個SAL及它出現的次數。內聯視圖Y使用窗口函數DENSE_RANK(它允許綁帶)給結果排序。結果按每個SAL出現的次數分等級,如下所示:

    1 select sal,

    2         dense_rank()over(order by cnt desc) as rnk

    3    from (

    4 select sal,count(*) as cnt

    5    from emp

    6   where deptno = 20

    7   group by sal

    8         ) x

       SAL         RNK

    ----- ----------

    3000           1

       800           2

    1100           2

    2975           2

    最外層的查詢只簡單地保留RNK為1的行。

    Oracle

    內聯視圖將返回所有SAL及其出現的次數,如下所示:

    select sal, count(*) cnt

       from emp

    where deptno=20

    group by sal

       SAL         CNT

    ----- ----------

       800           1

    1100           1

    2975           1

    3000           2

    下一步,使用聚集函數MAX的KEEP擴展查找模式。如果仔細分析下面給出的KEEP子句,會發現它又有三個子句,即DENSE_RANK、FIRST和ORDER BY CNT DESC:

    keep(dense_rank first order by cnt desc)

    這種做法對求模式極其方便。KEEP子句根據內聯視圖返回的CNT值來確定MAX返回SAL的哪個值。按從右向左的方向將CNT遞減排序,然后保留下按DENSE_RANK次序返回的所有CNT值的第一個值。查看一下內聯視圖的結果集,就會看到3000具有最高的CNT值 —— 2。MAX(SAL) 返回的是擁有最高CNT值的最大SAL,在本例中是3000。

    有關Oracle中集合函數的KEEP擴展的深入討論,請參閱第11章第11.11節。有關Oracle中集合函數的KEEP擴展的深入討論,請參閱第11章第11.11節。

    MySQL和PostgreSQL

    子查詢將返回每個SAL出現的次數。外層查詢將返回其的出現次數大于等于子查詢所返回所有計數值的SAL(換句話說,外層查詢會返回DEPTNO 20中出現最多的工資)。

    posted on 2008-05-14 21:44 紙飛機 閱讀(341) 評論(0)  編輯  收藏 所屬分類: Database
    主站蜘蛛池模板: 成人AV免费网址在线观看| 成人免费AA片在线观看| 亚洲国产精品综合久久网络| 亚洲高清视频在线| 最近中文字幕无免费视频| 亚洲国产品综合人成综合网站| 日韩免费人妻AV无码专区蜜桃| 亚洲人成在线播放网站岛国| 无码av免费一区二区三区试看| 亚洲视频在线观看一区| **aaaaa毛片免费| 亚洲精品中文字幕无乱码麻豆| 成人黄动漫画免费网站视频 | 亚洲自偷自偷图片| 日韩免费高清播放器| 亚洲国产精品自在在线观看| 日本免费xxxx| 亚洲av中文无码字幕色不卡| 亚洲成AV人网址| 黄网站免费在线观看| 亚洲福利电影一区二区?| 国产卡一卡二卡三免费入口| 久久亚洲精品无码av| 久久精品国产亚洲精品| 无码人妻一区二区三区免费n鬼沢| 亚洲美女视频一区| 污视频网站在线观看免费| 免费看片在线观看| 亚洲欧美日韩一区二区三区| 亚洲av无码成人精品区| 免费无码一区二区三区蜜桃| 亚洲成av人片不卡无码| 国产精品久久久久影院免费| 中文永久免费观看网站| 亚洲国产中文在线二区三区免| 国产男女猛烈无遮挡免费视频网站| 成在线人免费无码高潮喷水| 亚洲一级毛片视频| 啦啦啦完整版免费视频在线观看 | 99视频免费播放| 苍井空亚洲精品AA片在线播放|