官网文档说明

ROW_NUMBER

Syntax


Description of the illustration row_number.gif

See Also:

"Analytic Functions" for information on syntax, semantics, and restrictions

Purpose

ROW_NUMBER is an analytic function. It assigns a unique number to each row to which it is applied (either each row in the partition or each row returned by the query), in the ordered sequence of rows specified in the order_by_clause, beginning with 1.

By nesting a subquery using ROW_NUMBER inside a query that retrieves the ROW_NUMBER values for a specified range, you can find a precise subset of rows from the results of the inner query. This use of the function lets you implement top-N, bottom-N, and inner-N reporting. For consistent results, the query must ensure a deterministic sort order.

You cannot nest analytic functions by using ROW_NUMBER or any other analytic function for expr. However, you can use other built-in function expressions for expr. Refer to "About SQL Expressions" for information on valid forms of expr.

Examples

The following example finds the three highest paid employees in each department in the hr.employees table. Fewer than three rows are returned for departments with fewer than three employees.

SELECT department_id, first_name, last_name, salary
FROM
(SELECTdepartment_id, first_name, last_name, salary,ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary desc) rnFROM employees
)
WHERE rn <= 3
ORDER BY department_id, salary DESC, last_name;

The following example is a join query on the sh.sales table. It finds the sales amounts in 2000 of the five top-selling products in 1999 and compares the difference between 2000 and 1999. The ten top-selling products are calculated within each distribution channel.

SELECT sales_2000.channel_desc, sales_2000.prod_name,sales_2000.amt amt_2000,  top_5_prods_1999_year.amt amt_1999,sales_2000.amt  - top_5_prods_1999_year.amt amt_diff
FROM
/* The first subquery finds the 5 top-selling products per channel in year 1999. */(SELECT channel_desc, prod_name, amtFROM(SELECT channel_desc, prod_name, sum(amount_sold) amt,ROW_NUMBER () OVER (PARTITION BY channel_descORDER BY SUM(amount_sold) DESC) rnFROM sales, times, channels, productsWHERE sales.time_id = times.time_idAND times.calendar_year = 1999AND channels.channel_id = sales.channel_idAND products.prod_id = sales.prod_idGROUP BY channel_desc, prod_name)WHERE rn <= 5) top_5_prods_1999_year,
/* The next subquery finds sales per product and per channel in 2000. */(SELECT channel_desc, prod_name, sum(amount_sold) amtFROM sales, times, channels, productsWHERE sales.time_id = times.time_idAND times.calendar_year = 2000AND channels.channel_id = sales.channel_idAND products.prod_id = sales.prod_idGROUP BY channel_desc, prod_name) sales_2000
WHERE sales_2000.channel_desc = top_5_prods_1999_year.channel_descAND sales_2000.prod_name = top_5_prods_1999_year.prod_name
ORDER BY sales_2000.channel_desc, sales_2000.prod_name
;
CHANNEL_DESC    PROD_NAME                                          AMT_2000   AMT_1999   AMT_DIFF
--------------- --------------==-------------------------------- ---------- ---------- ----------
Direct Sales     17" LCD w/built-in HDTV Tuner                     628855.7 1163645.78 -534790.08
Direct Sales     Envoy 256MB - 40GB                               502938.54  843377.88 -340439.34
Direct Sales     Envoy Ambassador                                2259566.96 1770349.25  489217.71
Direct Sales     Home Theatre Package with DVD-Audio/Video Play  1235674.15 1260791.44  -25117.29
Direct Sales     Mini DV Camcorder with 3.5" Swivel LCD           775851.87 1326302.51 -550450.64
Internet         17" LCD w/built-in HDTV Tuner                     31707.48   160974.7 -129267.22
Internet         8.3 Minitower Speaker                            404090.32  155235.25  248855.07
Internet         Envoy 256MB - 40GB                                28293.87  154072.02 -125778.15
Internet         Home Theatre Package with DVD-Audio/Video Play   155405.54  153175.04     2230.5
Internet         Mini DV Camcorder with 3.5" Swivel LCD            39726.23  189921.97 -150195.74
Partners         17" LCD w/built-in HDTV Tuner                    269973.97  325504.75  -55530.78
Partners         Envoy Ambassador                                1213063.59  614857.93  598205.66
Partners         Home Theatre Package with DVD-Audio/Video Play   700266.58  520166.26  180100.32
Partners         Mini DV Camcorder with 3.5" Swivel LCD           404265.85  520544.11 -116278.26
Partners         Unix/Windows 1-user pack                         374002.51  340123.02   33879.4915 rows selected.

2. 我们可以用它来进行去重复

select * from (

select *, row_number() over( partition by cloumn1,column2 order by column3,column4) rn

) x where x.rn=1;

需要注意:

在同一组内部,如果order by 后面的排序列值相同的话,在逻辑意义上他们就是重复的,虽然它们最后得到的rn 不一样,因为row_number必须唯一.

但这个时候单独执行下面语句时,某行记录被分配到的rn=1, 而执行整体的时候这行记录并不一定会被分配rn=1.

select *, row_number() over( partition by cloumn1,column2 order by column3,column4) rn

转载于:https://www.cnblogs.com/princessd8251/p/3515374.html

ROW_NUMBER相关推荐

  1. SQL SERVER 函数ROW_NUMBER() 应用

    应用场景: 1.业务要求SQL查询结果中输出含有"序号"."行号". 2.数据表中某个空白字段需要用流水号填充. 以上场景时,可以使用SQL SERVER 的函 ...

  2. row number mysql_MySQL中的ROW_NUMBER()

    我总是最终遵循这种模式.鉴于此表: +------+------+ |    i |    j | +------+------+ |    1 |   11 | |    1 |   12 | |  ...

  3. 使用ROW_NUMBER 和partition by 解决报表中的查询问题

    在报表中遇到一个查询问题: 原始数据如下: Id cust_id call_date call_result 1 1 2012-03-15 09:00:00 fail 2 1 2012-03-15 0 ...

  4. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  5. ROW_NUMBER() OVER函数的基本用法

    简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记 ...

  6. R语言dplyr包排序及序号函数实战(row_number、ntile、min_rank、dense_rank、percent_rank、cume_dist)

    R语言dplyr包排序及序号函数实战(row_number.ntile.min_rank.dense_rank.percent_rank.cume_dist) 目录 R语言dplyr包排序及序号函数实 ...

  7. 分页存储过程(使用row_number()) Sql Server

    --按照排序字段取出表中数据,并加上一列排序字段序号 - >  从得到的表中取出字段序号在所要求的记录范围内的记录 CREATE PROCEDURE [dbo].[GetList_Page]   ...

  8. mysql col与row_使用mysql实现row_number() over(partition by col1 order by col2)函数

    [color=red]row_number() OVER (PARTITION BY COL1 ORDER BY COL2)[/color] 表示根据COL1分组,在分组内部根据 COL2排序,而此函 ...

  9. 【原创】MySQL 实现Oracle或者PostgreSQL的row_number over 这样的排名语法

    PostgreSQL 和Oracle 都提供了 row_number() over() 这样的语句来进行对应的字段排名, 很是方便.  MySQL却没有提供这样的语法. 最近由于从Oracle 迁移到 ...

  10. ROW_NUMBER() OVER 函数的用法

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW ...

最新文章

  1. Java Hibernate模板 学习总结
  2. Linux文件系统目录结构
  3. BugKuCTF 加密 ok
  4. linux 网络地址
  5. 如何使用JavaScript开发AR(增强现实)移动应用 (一)
  6. 文章中运用到的数学公式
  7. show,hide与fadeIn、fadeOu的区别
  8. SEO行业应该如何给客户报价
  9. 团队-科学计算器-开发环境搭建过程
  10. ip变更会影响账号登陆吗_代理IP的匿名度级别会影响自身稳定性吗
  11. 如何避免循环中丑陋的break和continue
  12. ECharts初体验(下载使用步骤、vscode取色器插件)
  13. 大学四年,这个Java自习路线,让我现在进了阿里
  14. 方舟生存计划怎么删除服务器信息,方舟服务器怎么删除玩家数据 | 手游网游页游攻略大全...
  15. html中绑定点击事件的三种方法
  16. 利用大智慧DDE数据生成每只股票的历史数据文件(SQLServer2005)
  17. 薪酬激励的中国困境 穆穆-movno1
  18. 容器技术-Docker 网络01-默认网络
  19. 计算机电子教室发展趋势,探究“电子教室”在信息技术课堂教学中应用的利与弊.doc...
  20. HDP聚合日志解析内容-ifile和tfile

热门文章

  1. LeetCode 5377. 将二进制表示减到 1 的步骤数
  2. mysql读写分离的含义_mysql的读写分离问题剖析
  3. 数据:本周DOT将解锁476.59万枚 上周共质押171.2万枚
  4. 港股区块链概念股走强,火币科技涨超17%
  5. 内卷下,贷中监控对商户端如何规则
  6. Linux文件类型详解
  7. BZOJ3172lg3966 TJOI单词(广义后缀自动机)
  8. 转发:一个复杂系统的拆分改造实践
  9. uiautomatorviewer 查看元素新思路
  10. offsetLeft,Left,clientLeft的区别