zoukankan      html  css  js  c++  java
  • row_number(),rank,DENSE_RANK,ntile简单演练



    1.row_number
       先来点数据,先建个表
     

    SET NOCOUNT ON

    CREATE TABLE Person(

    FirstName VARCHAR(10),

    Age INT,

    Gender CHAR(1))

    INSERT INTO Person VALUES ('Ted',23,'M')

    INSERT INTO Person VALUES ('John',40,'M')

    INSERT INTO Person VALUES ('George',6,'M')

    INSERT INTO Person VALUES ('Mary',11,'F')

    INSERT INTO Person VALUES ('Sam',17,'M')

    INSERT INTO Person VALUES ('Doris',6,'F')

    INSERT INTO Person VALUES ('Frank',38,'M')

    INSERT INTO Person VALUES ('Larry',5,'M')

    INSERT INTO Person VALUES ('Sue',29,'F')

    INSERT INTO Person VALUES ('Sherry',11,'F')

    INSERT INTO Person VALUES ('Marty',23,'F')

    直接用例子说明问题

    SELECT ROW_NUMBER() OVER (ORDER BY Age) AS [Row Number by Age],

    FirstName,

    Age

    FROM Person

    出现的数据如下
     Row Number by Age    FirstName Age

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

    1                    Larry      5

    2                    Doris      6

    3                    George     6

    4                    Mary       11

    5                    Sherry     11

    6                    Sam        17

    7                    Ted        23

    8                    Marty      23

    9                    Sue        29

    10                   Frank      38

    11                   John       40

     

     

     

    可以观察到,是根据年龄升序排列了,并且row_number()是给出了序列号了,这个序列号被重命名为Row Number by Age,

     

     

     

    如果不想按年龄排序,可以这样写
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS [Row Number by Record Set],

    FirstName,

    Age

    FROM Person

     

    另外一个例子
    SELECT ROW_NUMBER() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender],

     

    FirstName,

    Age,

    Gender

    FROM Person
    这里是按性别划分区间了,同一性别再按年龄来排序,输出结果如下

    Partition by Gender FirstName Age         Gender

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

    1                    Doris      6           F

    2                    Mary       11          F

    3                    Sherry     11          F

    4                    Sue        29          F

    1                    Larry      5           M

    2                    George     6           M

    3                    Sam        17          M

    4                    Ted        23          M

    5                    Marty      23          M

    6                    Frank      38          M

    7                    John       40          M

     

    注意,姓名M开始,序号又从1,2,3开始了

    2 RANK函数
     先看例子
    SELECT RANK() OVER (ORDER BY Age) AS [Rank by Age],

    FirstName,

    Age

    FROM Person

    输出如下

    Rank by Age          FirstName Age

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

    1                    Larry      5

    2                    Doris      6

    2                    George     6

    4                    Mary       11

    4                    Sherry     11

    6                    Sam        17

    7                    Ted        23

    7                    Marty      23

    9                    Sue        29

    10                   Frank      38

    11                   John       40

    看到了么,同年岭的话,将有相同的顺序,顺序成1,2,2,4了
    SELECT RANK() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender],

    FirstName, Age, Gender FROM Person输出为

    Partition by Gender FirstName Age         Gender

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

    1                    Doris      6           F

    2                    Mary       11          F

    2                    Sherry     11          F

    4                    Sue        29          F

    1                    Larry      5           M

    2                    George     6           M

    3                    Sam        17          M

    4                    Ted        23          M

    4                    Marty      23          M

    6                    Frank      38          M

    7                    John       40          M

    可以看到,按性别分组了,每个性别分组里,继续是用了rank函数

    3 DENSE_RANK 函数
       SELECT DENSE_RANK() OVER (ORDER BY Age) AS [Dense Rank by Age],
           FirstName,
           Age
      FROM Person
    输出结果为
    Dense Rank by Age    FirstName  Age
    -------------------- ---------- -----------
    1                    Larry      5
    2                    Doris      6
    2                    George     6
    3                    Mary       11
    3                    Sherry     11
    4                    Sam        17
    5                    Ted        23
    5                    Marty      23
    6                    Sue        29
    7                    Frank      38
    8                    John       40


    看到了么,rank函数区别是,顺序始终是连续的,Doris George同年,都是排第2,但之后的mary不象rank函数那样排第4,而是排第3位了


    4 ntile
    函数
     

    SELECT FirstName,

    Age,

    NTILE(3) OVER (ORDER BY Age) AS [Age Groups]

    FROM Person

     输出
     

    FirstName Age         Age Groups

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

    Larry      5           1

    Doris      6           1

    George     6           1

    Mary       11          1

    Sherry     11          2

    Sam        17          2

    Ted        23          2

    Marty      23          2

    Sue        29          3

    Frank      38          3

    John       40          3

    这个函数按照ntile(n)中的N,把记录强制分成多少段,11条记录现在分成3段了,larymary是第1
    ,sherrymaty是第2,suejohn是第3段了

     

  • 相关阅读:
    hdu 4644 BWT (kmp)
    《一炮走红的国家》:发展中国家与发达国家,每个国家都有独特之处,家家有本难念的经 五星推荐
    《南非的启示》:种族隔离政策与城乡二元体制有许多相似之处
    《小趋势:中国经济的关键变数》:经济学家社论文集,不适合非财经专业读者阅读
    《城市化转型与土地陷阱》:土地涨价要归公,五星推荐
    《中国经济怎么了》:经济时评文集,深度不够,时效性太差
    《变革中国》:熟悉又陌生的30年以来的经济政策变化史及其背后的决策者的权衡
    转贴:怎样避免婴儿突然死亡综合症?
    《网飞传奇》:出品纸牌屋的公司作为小公司打败行业巨头的经过。巨头只有两次还手机会。创新者的窘境的又一个案例。
    转贴:为什么带复方甘草片入境美国会被遣返?
  • 原文地址:https://www.cnblogs.com/BlogNetSpace/p/1301490.html
Copyright © 2011-2022 走看看