zoukankan      html  css  js  c++  java
  • SQL优化使用分析函数

      前段时间在 http://www.itput.net/ 看到 一篇文章,

          http://www.itpub.net/thread-1031306-1-4.html

    提到一个SQL语句:

     建立环境:

    create table t_emp(id numeric(10)
      ,name varchar(
    10),
    salary numeric(
    10,2));

      插入数据:

    insert into t_emp values(1,'jack',10000.50);
    insert into t_emp values(
    2,'jack2',8000.50);
    insert into t_emp values(
    3,'jack3',120000);
    insert into t_emp values(
    4,'jack4',5000);
    insert into t_emp values(
    5,'jack5',3000);

      要求:取出t_emp表中salary列中第2高的人和倒数第2高的人SQL语句。用一条SQL语句取出来

     

      一般的写法如下:

    select * from (select emp.*, row_number() over (order by salary asc) as rank from t_emp emp)  t
    where rank=2
    union all
    select 
    * from (select emp.*, row_number() over (order by salary desc) as rank from t_emp emp)  t
    where rank=2

      

      这里使用了row_number()这个分析函数.但还不是最好的。后来想了想,这样写会有个问题就是有重复的,

        如有多个第二的,和多个倒数第二。

        可以这样写: 

    select * from (select emp.*DENSE_RANK() over (order by salary desc) as rank,
    DENSE_RANK() over (order by salary asc) 
    as rank1
     from t_emp emp)  t
    where (rank=2 or rank1=2)

      总结:

             row_number(),DENSE_RANK,RANK() ,NTILE分析函数的确有时方便,如分页,取指定行,和排名等

          使用:

                 row_number(): 主要是分页

                 DENSE_RANK():排名(顺序始终是连续的),适合刚才的取出薪水排名(有重复的)

                 RANK():排名(列有重复,区间就是不连续的,如:1,2,2,4,4,6...)

                 NTILE(N):分组函数,把记录强制分成N段

  • 相关阅读:
    关于float与double
    【编程实践】母牛生小牛
    wlan的QOS配置
    C语言itoa函数和atoi 函数
    类似于QQ的简单的聊天代码
    多线程吃饺子练习
    线程练习
    接口练习
    电视练习
    5.22
  • 原文地址:https://www.cnblogs.com/zping/p/1261973.html
Copyright © 2011-2022 走看看