posts - 38, comments - 2, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          上周在優(yōu)化預(yù)警分析的工作中,發(fā)現(xiàn)由于分頁功能需要提供總條數(shù) ,項(xiàng)目組內(nèi)的普遍做法是進(jìn)行兩次sql查詢,一次用count(*)獲得總條數(shù),一次獲取真正的展現(xiàn)數(shù)據(jù)。其實(shí)oracle提供了olap函數(shù)對(duì)此進(jìn)行優(yōu)化,可通過偽列:count(*) over()獲得當(dāng)前sql的總條數(shù)。

              比如:select t.*,count(*) over() from dual 會(huì)返回總條數(shù)為1。
           
              olap函數(shù)主要用于統(tǒng)計(jì)分析,熟練掌握能很好的提高sql執(zhí)行效率。
                  count(*) over() 具體功能描述如下:
                 對(duì)一組內(nèi)發(fā)生的事情進(jìn)行累積計(jì)數(shù),如果指定*或一些非空常數(shù),count將對(duì)所有行計(jì)數(shù),如果指定一個(gè)表達(dá)式,count返回表達(dá)式非空賦值的計(jì)數(shù),當(dāng)有相同值出現(xiàn)時(shí),這些相等的值都會(huì)被納入被計(jì)算的值;可以使用DISTINCT來記錄去掉一組中完全相同的數(shù)據(jù)后出現(xiàn)的行數(shù)。
          SAMPLE:下面例子中計(jì)算每個(gè)員工在按薪水排序中當(dāng)前行附近薪水在[n-50,n+150]之間的行數(shù),n表示當(dāng)前行的薪水
                 例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行沒有,所以count計(jì)數(shù)值cnt3為2(包括自己當(dāng)前行);cnt2值相當(dāng)于小于等于當(dāng)前行的SALARY值的所有行數(shù)
          sql如下:

           SELECT last_name, salary, COUNT(*) OVER () AS cnt1,
                     COUNT(*) OVER (ORDER BY salary) AS cnt2,
                     COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS cnt3 FROM employees;

          結(jié)果如下 :

          LAST_NAME  SALARY  CNT2   CNT2  CNT3
          Olson          2100 107 1 3
          Markle 2200 107 3 2
          Philtanker 2200 107 3 2
          Landry 2400 107 5 8
          Gee 2400 107 5 8
          Colmenares 2500 107 11 10
          Patel 2500 107 10 10

          主站蜘蛛池模板: 台湾省| 长顺县| 柳江县| 蒙城县| 诸暨市| 淳化县| 湘潭县| 固阳县| 大邑县| 阿克苏市| 柞水县| 广饶县| 安顺市| 杭锦旗| 汝阳县| 阿克苏市| 应城市| 北海市| 钟祥市| 泰安市| 无为县| 扎兰屯市| 盘山县| 板桥市| 遵义市| 青铜峡市| 镇宁| 静安区| 贵定县| 太谷县| 会同县| 郓城县| 乐都县| 白河县| 卓资县| 离岛区| 太白县| 克东县| 资阳市| 宁强县| 灵璧县|