让SELECT查询结果额外增加自递的伪序号列

吉比特-笔试 1. 题一:打雷后下雨的概率是80%,而打闪电后下雨的概率是70%,那么即打雷又打闪电后下雨的概率是多少?   答:打雷后下雨和打闪电后下雨都是独立事件,P=1-又打雷又闪电但没下雨的概率= 1 - 0.2 *0.3 = 94%        题二:打雷后下雨的概率是80%,但是没打闪电后下雨的概率是20%,那么打雷了但没打闪电后下雨的概率是多少?答:P=0.8 *0.2 / ( 0.8 *0 阅读详情

有时需要让select返回的查询结果中存在一列实际的数据库表中并不存在的序号列,即在查询结果中额外增加自增的伪序号列。从网络上可以找到一些解决方案,但总结起来主要有三种:
1.使用数据库自带的序号函数实现
Oracle提供的ROWNUM,SQL Server 2005提供的RANK,ROW_NUMBER都可以比较简单地实现这种需求,不过这种方法对我并不适用,因为我用的是SQL SERVER 2000。

 

SQL Server 2005 引入几个新的排序(排名)函数,如ROW_NUMBER、RANK、DENSE_RANK等。

这些新函数使您可以有效地分析数据以及向查询的结果行提供排序值。 

 

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

ROW_NUMBER()

 

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

语法:ROW_NUMBER () OVER ( [ <partition_by_clause> ] <order_by_clause> ) 。

备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

参数:<partition_by_clause> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。 

      <order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。

返回类型:bigint 。

 

示例:

/*以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。*/

 

USE AdventureWorks

GO

SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode

FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID

JOIN Person.Address a ON a.AddressID = c.ContactID

WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0

/*

FirstName  LastName    Row Number  SalesYTD      PostalCode

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

Shelley    Dyck        1           5200475.2313  98027

Gail       Erickson    2           5015682.3752  98055

Maciej     Dusza       3           4557045.0459  98027

Linda      Ecoffey     4           3857163.6332  98027

Mark       Erickson    5           3827950.238   98055

Terry      Eminhizer   6           3587378.4257  98055

Michael    Emanuel     7           3189356.2465  98055

Jauna      Elson       8           3018725.4858  98055

Carol      Elliott     9           2811012.7151  98027

Janeth     Esteves     10          2241204.0424  98055

Martha     Espinoza    11          1931620.1835  98055

Carla      Eldridge    12          1764938.9859  98027

Twanna     Evans       13          1758385.926   98055

(13 行受影响)

*/

 

/*以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。*/ 

USE AdventureWorks;

GO

WITH OrderedOrders AS

(SELECT SalesOrderID, OrderDate,

ROW_NUMBER() OVER (order by OrderDate)as RowNumber

FROM Sales.SalesOrderHeader ) 

SELECT * 

FROM OrderedOrders 

WHERE RowNumber between 50 and 60;

/*

SalesOrderID OrderDate               RowNumber

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

43708        2001-07-03 00:00:00.000 50

43709        2001-07-03 00:00:00.000 51

43710        2001-07-03 00:00:00.000 52

43711        2001-07-04 00:00:00.000 53

43712        2001-07-04 00:00:00.000 54

43713        2001-07-05 00:00:00.000 55

43714        2001-07-05 00:00:00.000 56

43715        2001-07-05 00:00:00.000 57

43716        2001-07-05 00:00:00.000 58

43717        2001-07-05 00:00:00.000 59

43718        2001-07-06 00:00:00.000 60

(11 行受影响)

*/

 

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

RANK()

 

说明:返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。

语法:RANK () OVER ( [ < partition_by_clause > ] < order_by_clause > )

备注:如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。

      例如,如果两位顶尖销售员具有同样的 SalesYTD 值,他们将并列第一。

      由于已有两行排名在前,所以具有下一个最大 SalesYTD 的销售人员将排名第三。

      因此,RANK 函数并不总返回连续整数。 

      用于整个查询的排序顺序决定了行在结果集中的显示顺序。这也隐含了行在每个分区中的排名。

参数:< partition_by_clause > :将 FROM 子句生成的结果集划分为要应用 RANK 函数的分区。 

      < order_by_clause >:确定将 RANK 值应用于分区中的行时所基于的顺序。

返回类型:bigint

 

示例:

/*以下示例按照数量对清单中的产品进行了排名。行集按 LocationID 分区,按 Quantity 排序。

USE AdventureWorks;

GO

SELECT i.ProductID, p.Name, i.LocationID, i.Quantity, RANK() OVER (PARTITION BY i.LocationID order by i.Quantity) as RANK

FROM Production.ProductInventory i JOIN Production.Product p 

ON i.ProductID = p.ProductID

ORDER BY p.Name

GO

/*

ProductID   Name                                               LocationID Quantity RANK

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

1           Adjustable Race                                    6          324      71

1           Adjustable Race                                    1          408      78

1           Adjustable Race                                    50         353      117

2           Bearing Ball                                       6          318      67

2           Bearing Ball                                       1          427      85

2           Bearing Ball                                       50         364      122

3           BB Ball Bearing                                    50         324      106

3           BB Ball Bearing                                    1          585      110

3           BB Ball Bearing                                    6          443      115

4           Headset Ball Bearings                              1          512      99

4           Headset Ball Bearings                              6          422      108

4           Headset Ball Bearings                              50         388      140

316         Blade                                              10         388      33

......

(1069 行受影响)

*/ 

 

 

SQL code 

 

--接上.

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

DENSE_RANK()

 

说明:返回结果集分区中行的排名,在排名中没有任何间断。行的排名等于所讨论行之前的所有排名数加一。

语法:DENSE_RANK () OVER ( [ < partition_by_clause > ] < order_by_clause > )

备注:如果有两个或多个行受同一个分区中排名的约束,则每个约束行将接收相同的排名。

      例如,如果两位顶尖销售员具有相同的 SalesYTD 值,则他们将并列第一。

      接下来 SalesYTD 最高的销售人员排名第二。该排名等于该行之前的所有行数加一。

      因此,DENSE_RANK 函数返回的数字没有间断,并且始终具有连续的排名。 

      整个查询所用的排序顺序确定了各行在结果中的显示顺序。这说明排名第一的行可以不是分区中的第一行。

参数:< partition_by_clause > :将 FROM 子句所生成的结果集划分为数个将应用 DENSE_RANK 函数的分区。 

      < order_by_clause >:确定将 DENSE_RANK 值应用于分区中各行的顺序。

返回类型:bigint

 

示例:

/*以下示例返回各位置上产品数量的 DENSE_RANK。 */

USE AdventureWorks;

GO

SELECT  i.ProductID, p.Name, i.LocationID, i.Quantity, DENSE_RANK() OVER (PARTITION BY i.LocationID order by i.Quantity) as DENSE_RANK

FROM Production.ProductInventory i JOIN Production.Product p ON i.ProductID = p.ProductID

ORDER BY Name;

GO

/*

ProductID   Name                                               LocationID Quantity DENSE_RANK

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

1           Adjustable Race                                    1          408      57

1           Adjustable Race                                    6          324      52

1           Adjustable Race                                    50         353      82

879         All-Purpose Bike Stand                             7          144      34

712         AWC Logo Cap                                       7          288      38

3           BB Ball Bearing                                    50         324      74

3           BB Ball Bearing                                    6          443      81

3           BB Ball Bearing                                    1          585      82

*/

 

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

将上面三个函数放在一起计算,更能明显看出各个函数的功能。

 

CREATE TABLE rankorder(orderid INT,qty INT)

INSERT rankorder VALUES(30001,10)

INSERT rankorder VALUES(10001,10)

INSERT rankorder VALUES(10006,10)

INSERT rankorder VALUES(40005,10)

INSERT rankorder VALUES(30003,15)

INSERT rankorder VALUES(30004,20)

INSERT rankorder VALUES(20002,20)

INSERT rankorder VALUES(20001,20)

INSERT rankorder VALUES(10005,30)

INSERT rankorder VALUES(30007,30)

INSERT rankorder VALUES(40001,40)

INSERT rankorder VALUES(30007,30)

GO

--对一个列qty进行的排序

SELECT orderid,qty,

       ROW_NUMBER() OVER(ORDER BY qty) AS rownumber,

       RANK()       OVER(ORDER BY qty) AS rank,

       DENSE_RANK() OVER(ORDER BY qty) AS denserank

FROM rankorder

ORDER BY qty

/*

orderid     qty         rownumber            rank                 denserank

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

30001       10          1                    1                    1

10001       10          2                    1                    1

10006       10          3                    1                    1

40005       10          4                    1                    1

30003       15          5                    5                    2

30004       20          6                    6                    3

20002       20          7                    6                    3

20001       20          8                    6                    3

10005       30          9                    9                    4

30007       30          10                   9                    4

30007       30          11                   9                    4

40001       40          12                   12                   5

(12 行受影响)

*/ 

 

--对两个列qty,orderid进行的排序

SELECT orderid,qty,

       ROW_NUMBER() OVER(ORDER BY qty,orderid) AS rownumber,

       RANK()       OVER(ORDER BY qty,orderid) AS rank,

       DENSE_RANK() OVER(ORDER BY qty,orderid) AS denserank

FROM rankorder

ORDER BY qty,orderid

drop table rankorder

/*

orderid     qty         rownumber            rank                 denserank

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

10001       10          1                    1                    1

10006       10          2                    2                    2

30001       10          3                    3                    3

40005       10          4                    4                    4

30003       15          5                    5                    5

20001       20          6                    6                    6

20002       20          7                    7                    7

30004       20          8                    8                    8

10005       30          9                    9                    9

30007       30          10                   10                   10

30007       30          11                   10                   10

40001       40          12                   12                   11

(12 行受影响)

*/

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/lillllllll/archive/2009/10/07/4639957.aspx


2.使用临时表实现
SQL的IDENTITY函数可以提供自增的序号,但只能用在带有INTO table子句的SELECT语句中,所以如果可以使用临时表的情况下可以使用这种实现方法。和第一种方法一样,这种实现方法对我也不适用,因为现在的项目规定不能使用临时表。
eg:
SELECT IDENTITY(INT,1,1) as seq,field1,field2,...,fieldn INTO tmpTableName FROM srcTableName;
SELECT * FROM tmpTableName;
DROP TABLE tmpTableName;

3.使用SQL标准语法实现
第三种思路是:将结果集中能确定一行数据唯一性的某列或多列组合成标识符,再把结果集中小于等于标识符的记录数合计成一列,从而满足需求。
eg:
SELECT (SELECT COUNT(id) FROM srcTableName AS tbl1 WHERE tbl1.id<=tbl2.id) as seq,field1,field2,...,fieldn
FROM srcTableName AS tbl2 ORDER BY 1 ;
基于STM32的太阳能充电宝设计_资料编号31 系统硬件包括主控 STM32F103C8T6、0.96 OLED 显示屏、蜂鸣器、电源自锁开关、温度传感器 DS18B20、继电器、5 V DC 升压模块 、TB4056、18650锂电池、9 V太阳能板、稳压降压 5 V三极管。电源供应:锂电池为系统供电,9 伏太阳能板经 5 伏降压稳压三极管降压为 5 伏后传送到 TP4056,TP4056 为锂电池供电,因锂电池电压 3.7 伏,通过 5 伏 DC 升压模块升压到 5 伏为整个系统提供 5 伏电压。 阅读详情

相关推荐

BeikeShop跨境电商独立站系统V1.5.0免授权全开源版

BeikeShop 一款开源好用的跨境电商系统,BeikeShop 是基于 Laravel 开发的一款开源商城系统,主要面向外贸/跨境电商行业提供商品管理、订单管理、会员管理、支付、物流、系统管理等功能。BeikeShop商城 Beike多语言商城 多货币商城B2C商城系统 代码100%开源 PHP商城系统 H5/PC商城 跨境电商系统 跨境商城系统 电商商城系统 Laravel 9 框架插件化开发,MVC架构 支持插件市场。Event 机制实现Hook功能,自定义可视化装修。

820

如何让SELECT 查询结果额外增加自动递增序号

    图表1   如果数据表本身并不内含自动地增编号的字段时,要怎么做才能够让SELECT 查询结果如图表1所示,额外增加自动递增序号呢?我们提供下列五种方法供您参考:   USE 北风贸易;GO/* 方法一*/SELECT 序号= (SELECT COUNT(客户编号) FROM 客户 AS LiMing                    WHERE LiMing.客户编号&l...

weixin_33828101的博客 828

对族实例进行任意的矩阵变换,需要什么样的族?

问:一个小问题,想向您请教一下。 能不能实现一个这样的操作:创建了一个常规模型的FamilyInstance,然后知道旋转和平移的矩阵,能否根据变换矩阵更新FamilyInstance的位置,绕任意轴旋转任意角度。 请问什么样的实体才能在revit项目文件中任意旋转?貌似一般的实例只能在XY平面内旋转,并且LocationPoint中只有一个Rotation参数。答:您好,因为Revit里面的构件

我爱Revit —— BIM应用及BIM应用软件解决方案专栏 3628

SELECT查询自动增加序号

  如果数据表本身不含自动地增编号的字段时,要怎么做才能够让SELECT 查询结果自动增加递增序号呢?提供下列三种方法供您参考:/* 方法一*/SELECT 序号= (SELECT COUNT(客户编号) FROM 客户 AS aWHERE a.客户编号客户编号, 公司名称FROM 客户 AS b ORDER BY 序号;GO/* 方法二:*/SELECT 序号

Star8816的专栏 4870

SAP FICO CK40N批量发布标准价:常见报错排查与实战解决指南

本文详细解析了SAP FICO模块中CK40N批量发布标准价的常见报错及解决方案。从物料选择、成本核算到最终发布的全流程,提供了针对'已有标准成本估算记号'等典型报错的实战处理技巧,并分享了预防性维护与批量处理的高效方法,帮助财务人员提升工作效率。

weixin_29234509的博客 304

安卓7.0+抓包难题:雷电模拟器9.0+Charles系统证书安装全攻略

HTTPS协议通过SSL/TLS加密保障网络通信安全,其核心机制依赖于证书信任链。在Android系统中,自7.0版本起,谷歌收紧了证书信任策略,默认仅信任系统预置的CA证书,这直接导致了传统抓包方法失效。理解这一原理对于移动开发、测试及安全研究至关重要,它揭示了应用层安全策略与系统底层机制的关联。通过将用户证书安装至系统信任区,可以突破此限制,实现HTTPS流量的解密与分析。这一技术在App调试、接口测试、安全审计等场景中具有广泛的应用价值。本文以雷电模拟器9.0和Charles抓包工具为例,详细演示了如

weixin_42521843的博客 279

mysql中给查询的结果添加序号列

第一种,利用 SELECT 临时表 SELECT T2.num FROM ( SELECT ( @i := @i + 1 ) AS num, T.groupName FROM ( SELECT groupName, SUM( all_amt ) allAmt FROM app_agent WHERE `year_month` >= #{beginDateTime} AND.

米斯特程序猿 6659

《UDS协议从入门到精通》系列——图解0x85:控制DTC的设置

如何让ECU停止或恢复DTC状态位更新?有哪些注意点?图解+示例教你快速上手UDS 0x85服务!!

车载系统攻城狮 3863

mysql为select结果集添加序号列

两个函数简单搞定 DELIMITER $$ USE `oso_isp`$$ DROP FUNCTION IF EXISTS `rownum_reset`$$ CREATE FUNCTION `rownum_reset`() RETURNS INT(11) BEGIN SET @rno = 0; RETURN 1; END$$ DELIMITER ;...

weixin_30788239的博客 621

[数学建模][2012年A国赛模拟] 3. 葡萄酒的评价

暑期学校数学建模培训第三次模拟:2012年国赛A题,一道完全统计方面的题目。据老师反映当年有位老师所带领小组取得“全国10佳优秀论文奖”,我们大组搞统计的老师建模能力不行,但其统计理论非常扎实,在此期间给予我们非常大的帮助,十分感谢老师的倾囊相授。我们小组的定位也不在统计方向,主攻物理建模及优化模型,故本次模拟就用SPSS软件简单做了下,还是学到了多元统计的许多知识,达到了本次训练的目的。 ...

Y-puyu 的博客 3万+

ROS从入门到精通0-4:VSCode 搭建 ROS 工程环境

为了提高开发效率,可以先安装集成开发工具和使用方便的工具,本教程用VSCode搭建ROS工程环境

FRIGIDWINTER的博客 1万+

SQL语句查询结果额外添加一列序号自动增加

转自: http://www.cnblogs.com/tiantianne/archive/2009/10/13/1582368.html 一、让SELECT查询结果额外增加自递的伪序号列 在基于数据库的系统的开发过程中,有时需要让select返回的查询结果中存在一列实际

月夏的专栏 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SQL增加自递的伪序号列

一、让SELECT查询结果额外增加自递的伪序号列 在基于数据库的系统的开发过程中,有时需要让select返回的查询结果中存在一列实际的数据库表中并不存在的序号列,即在查询结果中额外增加自增的伪序号列。从网络上可以找到一些解决方案,但总结起来主要有三种: 1.使用数据库自带的序号函数实现 Oracle提供的ROWNUM,SQL Server 2005提供的RANK,ROW_NUMBER都可以比...

lianxiangG450qq的博客 1696

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

让select查询结果额外增加自增的伪序号列

<br />在基于数据库的系统的开发过程中,有时需要让select返回的查询结果中存在一列实际的数据库表中并不存在的序号列,即在查询结果中额外增加自增的伪序号列。从网络上可以找到一些解决方案,但总结起来主要有三种:<br />1.使用数据库自带的序号函数实现<br />Oracle提供的ROWNUM,SQL Server 2005提供的RANK,ROW_NUMBER都可以比较简单地实现这种需求,不过这种方法对我并不适用,因为我用的是SQL SERVER 2000。<br /><br />2.使用临时表实现<

青青的专栏 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SQL 查询结果自动递增序列号

一、让SELECT查询结果额外增加自递的伪序号列 在基于数据库的系统的开发过程中,有时需要让select返回的查询结果中存在一列实际的数据库表中并不存在的序号列,即在查询结果中额外增加自增的伪序号列。从网络上可以找到一些解决方案,但总结起来主要有三种: 1.使用数据库自带的序号函数实现 Oracle提供的ROWNUM,SQL Server 2005提供的RANK,ROW_NUMBER都可以比

阿喵的博客 1万+

工作笔记day2:MySQL SELECT (@i:=@i+1) 为查询结果增加序号

应用场景:我们在使用Mysql查到相应的结果,并额外给表加一个序号列,就要使用SELECT (@i:=@i+1) 举例一:不额为添加序列编号 SELECT * FROM `sys_user` 举例二:不额为添加序列编号 SELECT (@i:=@i+1) 序号,t.* FROM `sys_user` t ...

qq_47043112的博客 1243

如何让SELECT 查询结果额外增加自动递增序号 如果数据表本身并不内含自动递增编号的字段时,要怎么做才能够让SELECT查询结果额外增加自动递增序号呢?下列五种方法供您参考: USE test;

如何让SELECT 查询结果额外增加自动递增序号 如果数据表本身并不内含自动递增编号的字段时,要怎么做才能够让SELECT查询结果额外增加自动递增序号呢?下列五种方法供您参考: USE test;  GO /* 方法一*/ SELECT 序号= (SELECT COUNT(客户编号) FROM 客户 AS LiMing WHERE LiMing.客户编号 GO

wozengcong的专栏 1239

mysql查询加序号列

select @i:=@i+1 as number,字段,字段 from 表名,(SELECT @i:=0) AS t where 索引 order by 字段 desc。

刘贵庆的博客 454
上一篇: case的用法(可以把数据库里的列以行的方式显示出来!)
下一篇: 使用div作出一个模态框的效果
java_lbvs
博客等级 码龄19年 15粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值