• sql server之ROW_NUMBER() OVER()取每组的第N行数据


    先看个例子:

    document_id card_holder_id created_date document_type_id
    1 1 2015-7-1 1
    2 4 2015-7-2 1
    3 4 2015-7-3 5

     

     

     

     

    table: document

    大致的场景就是

        取每个card holder的最新的一条document_type_id为5数据, 并取得document_type_name的值(需要join另外一张表, 这里就不列出来了)。

    SQL实现:

    SELECT 
        document_type_id 
    FROM
    (
        -- 按card holder分组 按created_date降序排列
        SELECT 
            ROW_NUMBER() 
            OVER (
                PARTITION BY card_holder_id 
                ORDER BY created_date DESC
            ) AS row,
            document_type_id
        FROM
            document
        WHERE document_type_id = 5
    )AS T
    WHERE T.row = 1
    -- 这里取的是第一行数据

    定义

        返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

    语法

        ROW_NUMBER() OVER( [ PARTITION BY [COLUMN1] ] ORDER BY [COLUMN2])

        绿色字体表示选填, 即: ROW_NUMBER() OVER(ORDER BY [COLUMN])。

    备注   

        除非以下条件成立,否则不保证在每次执行时,使用 ROW_NUMBER() 的查询所返回行的顺序完全相同。

    1. 分区列的值是唯一的。

    2. ORDER BY 列的值是唯一的。

    3. 分区列和 ORDER BY 列的值的组合是唯一的。

  • 相关阅读:
    Ubuntu 18.04 初始化(server版本 )
    named主从环境部署
    CentOS 源码安装svn
    端口状态
    进程状态
    top命令详解
    gitlab部署
    day16
    day15
    day14
  • 原文地址:https://www.cnblogs.com/MonkeyKingK/p/5021740.html
Copyright © 2020-2023  润新知