(转)[SQL Server] 順位付け関数

原文链接:http://memo.itsysgroup.com/?p=362

久しぶりにSQL Serverの開発備忘録です。 seoばかりアップしてて、開発備忘録では検索順位が悪いので、開発備忘録を多めに書きます^^

で、順位付け関数ですが、先日同僚が使って居るのを見て、整理しようと思いたちました。 順位付け関数には、

  1. row_number
  2. rank
  3. dense_rank
  4. ntile

の4種類が有ります。

基本的な使用方法は、  関数() over(order by カラム名)  ntile(数値)over(order by カラム名) の様な感じで書きます。 overの中には、パーティションも入れることができ、例えば部門やカテゴリ内での順位付けもできます。 そんな場合は、関数() over(partition by 部門,カテゴリ order by カラム名) のようになります。

それぞれの関数の返す値ですが、

  1. row_numberは、overで指定された条件の結果セットに基づいて連続した数値を返します。なので、oder byで指定したカラムの値が同じ場合、どちらの行が上に来るかは保証は有りません。
  2. rankは、ランキングなので、oder byで指定したカラムの値が同じ場合、同位となり、次に来る行の順位は飛ぶことになります。1位1位3位という感じですね。
  3. dense_rankは、rankに似ていますが、順位が飛ぶことがなく1位1位2位のようになります。
  4. ntileは、グループ分けをしてくれる感じです。ntile(4)とするとoverで指定された条件の結果セットに基づいて4行づつ同じ数値を返してくれます。ただし、行が4で割れないと後ろの方のグループで3行とかに調整されます。

具体的な例を以下に示します。 データ: declare @tbl1 table(employ_cd int,section_cd int, uriage_kingaku int, rieki_kingaku int) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000001,001,180,10) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000011,001,150,9) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000012,001,220,15) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000013,001,210,14) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000014,001,180,11) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000015,001,190,12) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000016,001,200,13) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000017,001,210,14) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000018,001,220,15) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000019,001,200,10) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000020,002,200,11) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000030,002,250,15) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000040,002,220,15) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000050,002,210,10) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000060,002,220,11) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000070,002,230,12) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000080,002,240,13) insert into @tbl1 (employ_cd, section_cd, uriage_kingaku,rieki_kingaku) values (000000090,002,250,14)

検索: select row_number() over(order by rieki_kingaku desc, uriage_kingaku desc) as row_number , rank() over(order by rieki_kingaku desc, uriage_kingaku desc) as rank , dense_rank() over(order by rieki_kingaku desc, uriage_kingaku desc) as dense_rank , ntile(3) over(order by rieki_kingaku desc, uriage_kingaku desc) as ntile, * from @tbl1 S1

結果: row_number rank dense_rank ntile employ_cd section_cd uriage_kingaku rieki_kingaku ———- —- ———- —– ——— ———- ————– ————- 1      1      1      1      30      2      250      15 2      2      2      1      40      2      220      15 3      2      2      1      12      1      220      15 4      2      2      1      18      1      220      15 5      5      3      1      90      2      250      14 6      6      4      1      17      1      210      14 7      6      4      2      13      1      210      14 8      8      5      2      80      2      240      13 9      9      6      2      16      1      200      13 10      10      7      2      70      2      230      12 11      11      8      2      15      1      190      12 12      12      9      2      60      2      220      11 13      13      10      3      20      2      200      11 14      14      11      3      14      1      180      11 15      15      12      3      50      2      210      10 16      16      13      3      19      1      200      10 17      17      14      3      1      1      180      10 18      18      15      3      11      1      150      9

少し見辛いですが、こんな感じに並びます。 partitionを加えた結果は出しませんが、SQLはこんな感じになります。

select row_number() over(partition by section_cd order by rieki_kingaku desc, uriage_kingaku desc) as row_number , rank() over(partition by section_cd order by rieki_kingaku desc, uriage_kingaku desc) as rank , dense_rank() over(partition by section_cd order by rieki_kingaku desc, uriage_kingaku desc) as dense_rank , ntile(3) over(partition by section_cd order by rieki_kingaku desc, uriage_kingaku desc), * from @tbl1 S1

时间: 2024-10-03 14:55:49

(转)[SQL Server] 順位付け関数的相关文章

Oracle sql%rowcount 返回影响行数;sql server @@RowCount返回影响行数

sql server中,返回影响行数是:If @@RowCount<1 Oracle中,返回影响行数是:If sql%rowcount<1 例: sqlserver: create procedure Proc_test @Stat int=0, @MsgId varchar(50)='', AS BEGIN Update T_Mt Set Stat=@Stat,OStat=@Stat,RptTime=Getdate() Where MsgId=@MsgId If @@RowCount<

7 配置 SQL Server网络通信

SQL Server2008是一个客户端-服务器应用程序,它可以在多个网络连接上有效地交换数据和指令.了解网络连接以及如何配置它们是数据库管理员工作内容的一大部分.Microsoft通过将 SQL Server2008所支持的协议数减少为几个最常用的协议,减轻了数据库管理员的工作负担.但与此同时,数据库管理员的工作又变得更为复杂,因为可以通过端点服务器对象使用每个协议配置多个连接类型.本章讨论了可配置的不同端点,以及端点所依赖的协议配置,此外还简要介绍了可以使用 SQL Server2008配置

为什么SQL语句Where 1=1 and在SQL Server中不影响性能

    最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能.最后结论是不影响.     虽然结论正确,但对问题的认识却远远没有解决问题的根本.实际上在T-SQL语句的书写过程中经常犯得错误就是得出一个很窄的结论,然后教条式的奉若圣经,对于T-SQL领域来说,在网上经常可以看到所谓的优化守则,随便在网上搜了一些摘录如下: 不要有超过5个以上的表连接(JOIN) 考虑使用临时表或表变量存放中间结果 少用子查询 视图嵌套不要过深,一般视图嵌套不要超过2个为宜. 对出现在wh

安装 SQL Server 2008 R2 的硬件和软件要求(转)

以下各部分列出了安装和运行 SQL Server 2008 R2 的最低硬件和软件要求.有关 SharePoint 集成模式下的 Analysis Services 的要求的详细信息,请参阅硬件和软件要求 (PowerPivot for SharePoint). 对于 SQL Server 2008 R2 的 32 位和 64 位版本,适用以下要求: SQL Server 2008 R2 Datacenter 有评估版可供使用,试用期为 180 天.有关详细信息,请参阅 SQL Server:

SQL Server里的 ISNULL 与 NULLIF

SQL Server 中有两个參数,语法: ISNULL(check_expression, replacement_value) check_expression 与 replacement_value 数据类型必须一致 假设 check_expression 为 NULL,则返回 replacement_value 假设 check_expression 不为 NULL,则返回 check_expression NULLIF 用于检查两个表达式,语法: NULLIF(expression,

安装 SQL Server 2012 的硬件和软件要求(官方全面)

以下各节列出了安装和运行 SQL Server 2012 的最低硬件和软件要求. Hardware and Software Requirements (PowerPivot for SharePoint and Reporting Services in SharePoint Mode).' data-guid="ac62f277a77cf0fe4624123fb93d4313">有关 SharePoint 集成模式下 Analysis Services 的要求的详细信息,请参

sql server存储过程编程

存储过程是一组完成特定功能的SQL 语句集合,经编译后存储在数据库中. 存储过程作为一个单元进行处理并以一个名称来标识.它能向用户返回数据.向数据库表中写入或修改数据等操作. 用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. 存储过程的作用 执行速度快; 减少网络流量; 作为一种安全机制.通过设置用户只可能使用存储过程访问数据,限制用户不能直接操作数据库中的敏感数据,以保障数据的安全性; 屏蔽T-SQL命令,提供交互查询的客户接口,增加数据库应用的方便性. 存储过程和函数

SQL Server中的锁的简单学习

原文:SQL Server中的锁的简单学习 简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要

T-SQL查询进阶—理解SQL Server中的锁

在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要锁 在开始谈锁之前,首先要简单了解一下事务和事务的