<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 紙飛機 閱讀(343) 評論(0)  編輯  收藏 所屬分類: Database
    主站蜘蛛池模板: 日本牲交大片免费观看| 亚洲av日韩av永久无码电影| 中文字幕免费人成乱码中国| 青青草原亚洲视频| 羞羞漫画页面免费入口欢迎你| 免费看的一级毛片| 日韩亚洲人成网站| 亚洲国产精品无码久久九九| 午夜不卡AV免费| 久久精品一本到99热免费| 亚洲嫩模在线观看| 国产成人yy免费视频| 亚洲国产乱码最新视频| 日本不卡高清中文字幕免费| 免费人人潮人人爽一区二区| 国产亚洲视频在线播放| 久久青草国产免费观看| 亚洲av永久无码嘿嘿嘿| 成人午夜免费福利| 日韩在线一区二区三区免费视频| 亚洲高清最新av网站| 永久免费A∨片在线观看| 亚洲系列中文字幕| 四虎成人精品一区二区免费网站| 男女猛烈xx00免费视频试看| 在线日韩日本国产亚洲| 7x7x7x免费在线观看| 亚洲国产精品成人AV在线| 亚洲精品乱码久久久久久不卡| 中国黄色免费网站| 亚洲国产精品日韩在线| 免费a级毛片大学生免费观看 | 亚洲高清国产AV拍精品青青草原| 亚洲免费视频在线观看| 亚洲乱亚洲乱妇无码| 亚洲午夜日韩高清一区| 四虎免费影院ww4164h| 国产成人久久精品亚洲小说| 亚洲av无码无在线观看红杏| 色www免费视频| 亚洲国产人成网站在线电影动漫|