一个表中定时自动入库 ID是递增的 怎么使用 row_row numberr 确定少了那一个

6640人阅读
Oracle(27)
首先来说一下rownum与rowid含义:
顾名思义rownum就是行数/行号,而rowid就是编码/编号/唯一识别号,所以他是类似&AAAR8gAAEAAAAErAAK&的编号,注意他是没有先后顺序的,也就是说他和数据入库时间没有任何关系,打个比方:他就像磁盘、内存存储数据用的是16进制的地址一样。
他们都是伪列,可以理解成表中的一个列只是他们并不是你创建的。同样是伪列区别是什么呢?
rowid是你录入数据时有数据库自动为这条记录添加的唯一的18位编号是一个物理编号用于找到这条记录(顺便说一句这也是为什么数据优调的时候强调尽量使用rowid的原因),他是不会随着查询而改变的 除非在表发生移动(比如表空间变化,数据导入/导出以后),才会发生变化。
rownum是根据sql查询后得到的结果自动加上去的,但是他却不受到sql中order by排序的影响,因为他和rowid的顺序一样是系统按照记录插入时的顺序给记录排的号(顺序的、无跳跃)。&但是如果你想让rownum和order by一样的顺序 那么可以使用子查询,形如:select rownum,t.* from (select * from 表空间名 order by 字段名) t& 这样的话rownum就是根据该字段进行排序的编号了,为什么会这样呢,本人理解:rownum是根据表记录输出的行号,与筛选语句、排序语句都无关所以当用子查询时等于生成了一个表于是就按照这张表从1开始排序了。 同样,也可以用下面要提得到的分析函数中的row_number() over(order by 需要排序的字段名)。
值得一提的是MSSQL是没有rownum和rowid的。
下面说说分析函数row_number()、rank()、dense_rank()
ROW_NUMBER(): Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序),因为row_number()是分析函数而rownum是伪列所以row_number()一定要over而rownum不能over。
RANK():Rank函数返回一个唯一的值,除非遇到相同的数据,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)。
DENSE_RANK():Dense_rank函数返回一个唯一的值,除非当碰到相同数据,此时所有相同数据的排名都是一样的。dense_rank()是连续排序,有两个第二名时仍然跟着第三名。他和row_number的区别在于row_number是没有重复值的。
下面举个例子:
【1】测试环境:
SQL&&desc&user_&Name&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Null?&&&&Type&-----------------------------------------&--------&----------------------------&REGION_ID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NUMBER(2)&CUSTOMER_ID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& NUMBER(2)&CUSTOMER_SALES&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& NUMBER
【2】测试数据:
SQL&&select&*&from&user_order&order&by&customer_&REGION_ID&CUSTOMER_ID&CUSTOMER_SALES----------&-----------&--------------&&&&&&&&&5&&&&&&&&&&&1&&&&&&&&&&&&& 151162&&&&&&&&10&&&&&&&&&&29&&&&&&&&& && 903383&&&&&&&&&6&&&&&&&&&&&7&&&&&&&&&&&&& 971585&&&&&&&&10&&&&&&&&&&28&&&&&&&&&&& 986964&&&&&&&&&9&&&&&&&&&&21&&&&&&&&&&&1020541&&&&&&&&&9&&&&&&&&&&22&&&&&&&&&& 1036146&&&&&&&&&8&&&&&&&&&&16&&&&&&&&&& 1068467&&&&&&&&&6&&&&&&&&&&&8&&&&&&&&&&& 1141638&&&&&&&&&5&&&&&&&&&&&3&&&&&&&&&&& 1161286&&&&&&&&&5&&&&&&&&&&&5&&&&&&&&&&& 1169926&&&&&&&&&8&&&&&&&&&&19&&&&&&&&&& 1174421&&&&&&&&&7&&&&&&&&&&12&&&&&&&&&& 1182275&&&&&&&&&7&&&&&&&&&&11&&&&&&&&&& 1190421&&&&&&&&&6&&&&&&&&&&10&&&&&&&&&& 1196748&&&&&&&&&6&&&&&&&&&&&9&&&&&&&&&&& 1208959&&&&&&&&10&&&&&&&&&&30&&&&&&&&&&1216858&&&&&&&&&5&&&&&&&&&&&& 2&&&&&&&&&&&&&&& 1224992&&&&&&&&&&&9&&&&&&&&&&&& 24&&&&&&&&&&&&& 1224992&&&&&&&&&&&9&&&&&&&&&&&& 23&&&&&&&&&&&&& 1224992&&&&&&&&&& 8&&&&&&&&&&18&&&&&&&&&& 1253840&&&&&&&&&7&&&&&&&&&&15&&&&&&&&&& 1255591&&&&&&&&&7&&&&&&&&&&13&&&&&&&&&& 1310434&&&&&&&&10&&&&&&&&&&27&&&&&&&&& 1322747&&&&&&&&&8&&&&&&&&&&20&&&&&&&&&& 1413722&&&&&&&&&6&&&&&&&&&&&6&&&&&&&&&&& 1788836&&&&&&&&10&&&&&&&&&&26&&&&&&&&& 1808949&&&&&&&&&5&&&&&&&&&&&4&&&&&&&&&&& 1878275&&&&&&&&&7&&&&&&&&&&14&&&&&&&&&& 1929774&&&&&&&&&8&&&&&&&&&&17&&&&&&&&&& 1944281&&&&&&&&&9&&&&&&&&&&25&&&&&&&&&& 223270330&rows&selected.
【3】row_number()、rank()、dense_rank()这三个分析函数的区别实例
SQL&&select&region_id,&customer_id,&sum(customer_sales)&total,&&2&&&&&&&&&rank()&over(order&by&sum(customer_sales)&desc)&rank,&&3&&&&&&&&&dense_rank()&over(order&by&sum(customer_sales)&desc)&dense_rank,&&4&&&&&&&&&row_number()&over(order&by&sum(customer_sales)&desc)&row_number&&5&&&&from&user_order&&6&&&group&by&region_id,&customer_&REGION_ID&CUSTOMER_ID&&&&&&TOTAL&&&&&&&RANK&DENSE_RANK&ROW_NUMBER----------&-----------&----------&----------&----------&----------&&&&&&&&&&&&&&&&&&&8&&&&&&&&&&18&&&&&&&&&&&&&&&&1253840&&&&&&&&&11&&&&&&&&&11&&&&&&&&&11&&&&&&&&&5&&&&&&&&&&&2&&&&&&&&&&&&&&&&&1224992&&&&&&&&&12&&&&&&&&&12&&&&&&&&&12&&&&&&&&&9&&&&&&&&&&23&&&&&&&&&&&&&&&&1224992&&&&&&&&&12&&&&&&&&&12&&&&&&&&&13&&&&&&&&&9&&&&&&&&&&24&&&&&&&&&&&&&&&&1224992&&&&&&&&&12&&&&&&&&&12&&&&&&&&&14&&&&&&&&10&&&&&&&&&&30&&&&&&&&&&&&&&&1216858&&&&&&&&&15&&&&&&&&&& 13&&&&&&&&&&& 15&&30&rows&selected.
请注意上面的绿色高亮部分,这里生动的演示了3种不同的排名策略:①对于第一条相同的记录,3种函数的排名都是一样的:12②当出现第二条相同的记录时,Rank和Dense_rank依然给出同样的排名12;而row_number则顺延递增为13,依次类推至第三条相同的记录③当排名进行到下一条不同的记录时,可以看到Rank函数在12和15之间空出了13,14的排名,因为这2个排名实际上已经被第二、三条相同的记录占了。而Dense_rank则顺序递增。row_number函数也是顺序递增比较上面3种不同的策略,我们在选择的时候就要根据客户的需求来定夺了:①假如客户就只需要指定数目的记录,那么采用row_number是最简单的,但有漏掉的记录的危险②假如客户需要所有达到排名水平的记录,那么采用rank或dense_rank是不错的选择。至于选择哪一种则看客户的需要,选择dense_rank或得到最大的记录
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:123936次
积分:1433
积分:1433
排名:千里之外
原创:12篇
转载:54篇
评论:26条
(1)(1)(2)(1)(4)(9)(7)(1)(11)(27)(1)(2)SQL Server 08(133)
一、让SELECT查询结果额外增加自递的伪序号列
在基于的的开发过程中,有时需要让select返回的查询结果中存在一列实际的库表中并不存在的序号列,即在查询结果中额外增加自增的伪序号列。从上可以找到一些方案,但总结起来主要有三种:
1.使用数据库自带的序号函数实现
Oracle提供的ROWNUM, Server 2005提供的RANK,ROW_NUMBER都可以比较简单地实现这种需求,不过这种方法对我并不适用,因为我用的是SQL SERVER 2000。
2.使用临时表实现
SQL的IDENTITY函数可以提供自增的序号,但只能用在带有INTO table子句的SELECT语句中,所以如果可以使用临时表的情况下可以使用这种实现方法。和第一种方法一样,这种实现方法对我也不适用,因为现在的项目规定不能使用临时表。
SELECT IDENTITY(INT,1,1) as seq,field1,field2,...,fieldn INTO tmpTableName FROM srcTableN
SELECT * FROM tmpTableN
DROP TABLE tmpTableN
3.使用SQL标准语法实现
第三种思路是:将结果集中能确定一行数据唯一性的某列或多列组合成标识符,再把结果集中小于等于标识符的记录数合计成一列,从而满足需求。
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 ;
二、使用INSERT添加行
INSERT语句可给表添加一个或多个新行,增加单行的语法没什么可说的,此处描述的是使用多行的情况,语法为:
INSERT INTO destTable (field1,field2,...,fieldn) FROM SELECT field1,field2,...,fieldn FROM srcTable
在维护系统时,经常能在遗留里发现这样的新增多条记录实现方式:
1.循环构造多条插入语句,再执行一次批处理保存。
2.循环构造多条插入语句,每条语句执行一次保存。
对于使用第一种方式来新增从其他数据库表中选择的记录的做法,我觉得是对数据库资源的浪费,因为通常情况下这种实现方式完全可以通过一条INSERT语句实现。
可能你会说主键的生成是一个问题,但我并不认为这会成为问题,在select时生成主键并不困难,上文就提到了内容就可以在此处使用。对于采用第二种方法的“先辈”,我只能彻底无语,因为这种方式根本就没有考虑数据库的执行效率和事务的完整性,一旦保存过程被中断就会导致数据的不完整问题的出现。
三、CONVERT函数的使用
CONVERT可以用在不同数据类型之间的转换,语法为:
CONVERT (data_type[(length)], expression [, style])
在项目中使用到这个函数的情形多是将日期形转换为字符串,如将日期型转换为''或' 12:30:50',实现代码为convert(varchar(10),datetime,120)、convert(varchar(19),datetime,120)
四、SQL函数实现
select row_number()OVER(ORDER BY name DESC),name from biao
row_number() SQL自带函数
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:281577次
积分:4384
积分:4384
排名:第4729名
原创:105篇
转载:477篇
评论:25条
(1)(6)(8)(8)(7)(9)(2)(6)(6)(10)(13)(39)(10)(11)(17)(42)(5)(1)(7)(2)(33)(15)(4)(5)(5)(56)(59)(21)(48)(59)(29)(25)(7)(11)当前位置:
MySQL&表&添加字段&auto_increment
本文介绍MySQL数据库使用SQL语句来在现有的表中,添加一个自动增长(auto_increment)字段。
本文介绍MySQL数据库使用SQL语句来在现有的表中,添加一个自动增长(auto_increment)字段。
所谓自动增长字段,是指一个表中的这样一类字段:它们的值是系统指定,不需要插入、也不能插入,并且还不能修改的字段。值可能从1开始,每增加一条记录,这个值就加1。很显示这样的字段非常适合来做表的索引ID。
下面,我们直接在现有的test表中,添加一个xx_id的字段,数据类型为int,指定为auto_increment。
mysql& alter table test add column xx_id int auto_
ERROR ): Incorr there can be only one auto column and it must be defined as a key
居然失败了!错误指示说:一个表中,最多只能有一个自动字段,并且这个自动字段还必须被定义为key。我想这里的自动字段就是指自动增长字段(auto_increment),而这里说的key,很有可能是primary key,即主键。
那我们就创建一个新表,然后,给它添加一个自动增长字段吧。
mysql& create table test2(name varchar(20) not null);
Query OK, 0 rows affected (0.09 sec)
创建表成功了。
mysql& alter table test2 add column id int auto_
ERROR ): Incorr there can be only one auto colum
n and it must be defined as a key
又失败了,应该是没有把这个id指定成key吧,改一下再来:
mysql& alter table test2 add column id int auto_increment not null, add primary key(id);
Query OK, 0 rows affected (0.23 sec)
Records: 0& Duplicates: 0& Warnings: 0
mysql& describe test2;
+-------+-------------+------+-----+---------+----------------+
| Field | Type&&&&&&& | Null | Key | Default | Extra&&&&&&&&& |
+-------+-------------+------+-----+---------+----------------+
| name& | varchar(20) | NO&& |&&&& | NULL&&& |&&&&&&&&&&&&&&& |
| id&&& | int(11)&&&& | NO&& | PRI | NULL&&& | auto_increment |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
好了,这下子成功的成功的添加了一个自动增长字段,字段名为id,它具有auto_increment属性,并且是primary key(主键)。
关于MySQL中给表添加一个自动增长字段(auto_increment),本文就介绍这么多,希望对大家有所帮助,谢谢!
文章的版权
洪哥写文章很苦逼,如果本文对您略有帮助,点击感兴趣的广告支持洪哥!万分感谢!本文属于“洪哥笔记”原创文章,转载请注明来源地址:
关注与收藏
如果您在服务器运维、网络管理、网站或系统开发过程中有任何疑问,洪哥以此为饭碗,请加QQ:!
了解更多好文章,请关注我们的新浪微博和腾讯微博
亲,先存起来,方便以后再看啊!加入收藏夹的话,按Ctrl+D!
&&( 8:03:36)
&&( 23:00:18)
&&( 23:00:47)
&&( 11:08:34)
&&( 9:28:09)
&&( 10:54:08)
&&( 12:06:25)
&&( 15:33:57)
&&( 13:51:15)
&&( 10:51:54)
热门点击文章
洪哥推荐文章
友情链接:sql2000里,怎么样给,有相同列的 数据添加一个递增的编号_百度知道建网站选织梦模板,首选跟版网(最大的织梦模板商城),您可以把织梦模板网:
亲,跟版网是中国最具专业的DEDECMS模板资源提供商!您可以选择或者
SqlServer 2005中使用row_number()在一个查询中删除重复记录
& &以下内容您可能感兴趣: &
下面我们来看下,如何利用它来删除一个表中重复记录:
代码如下: If Exists(Select * rmation_Schema.Tables Where Table_Name Like '#Temp%') Drop Table #temp Create Table #temp ([Id] int, [Name] varchar(50), [Age] int, [Sex] bit default 1) Go Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(1,'James',25,default) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(1,'James',25,default) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(1,'James',25,default) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(2,'Lisa',24,0) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(2,'Lisa',24,0) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(2,'Lisa',24,0) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(3,'Mirsa',23,0) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(3,'Mirsa',23,0) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(3,'Mirsa',23,0) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(4,'John',26,default) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(5,'Abraham',28,default) Insert Into #temp ([Id] , [Name] , [Age] , [Sex] ) Values(6,'Lincoln',30,default) Delete T From (Select Row_Number() Over(Partition By [ID],[Name],[Age],[Sex] order By [ID]) As RowNumber,* From #Temp)T Where T.RowNumber & 1 Select * From #temp
注意倒数第二句脚本,我们在一个查询实现这个功能. 你可以自己执行T-SQL script 看效果.希望对您开发有帮助!
跟版网-专业织梦模板下载平台,转载请注明出处:
& &精心为您推荐: &
& &邀您关注: &
扫描左侧二维码即可在手机端访问此页面
扫描左侧二维码即可关注跟版网官方微信公众号,获取金币模板,还可以免费仿站哦!
扫描左侧二维码即可加入跟版网官方群,免费获取金币资源并可以与其他织梦高手共同交流学习
跟版网率先实现织梦的三网合一网站,从即日起()日,跟版网会陆续免费分享一批金币资源给需要的朋友,关注本站认证官方微信公众账号并回复相应的提取码,系统会自动将下载地址发送给您,同时这些金币资源也会分享在官方的QQ群中,欢迎各位朋友踊跃加入。另外本站后期会每周选择大家比较喜欢的网站仿制,并免费分享给大家,还有免费送金币活动哦!
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
- dede源码分享
售价:20金币
- dede源码分享
售价:10金币
- dede源码分享
售价:40金币
- 织梦html5模板
售价:60金币
- dede源码分享
售价:10金币
& & & 跟版网竭力打造中国最大的织梦源码和织梦模板商城,我们有一批经验丰富的设计师和程序员,发展五年,跟版网拥有丰富的织梦模板,欢迎您的咨询,我们将竭诚为您提供最优质的服务。
& & & 跟版网织梦源码商城坚持“创意+品质+服务”的高端理念,运用创意设计的理念为您塑造高品质的网络品牌形象。凭借五年的探索和实践,跟版网织梦源码商城拥有一支经验丰富、技术精湛、尽职尽责的网络服务团队。精品网站建设,从跟版网织梦源码商城建站开始。
& & & 跟版网织梦源码和模板可分为两种形式获得,一种是官方源码,另外一种是会员共享源码。两种源码都分为免费和收费两种形式。
& & & 跟版网官方收费源码可通过支付费用获得,具体操作流程可查看网址:。会员共享源码可通过共享模板获取金币下载。如觉得麻烦,可以联系客服QQ:进行金币充值,充值后可随意下载。}

我要回帖

更多关于 row number over 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信