资源描述:
《sql获取数据集中各类型中的最大值(最新值)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、最近在论坛中的MSSqlServer版块经常看到网友求助如何从一组数据集中获取每个类型中的某个字段最大的一条记录或者最新记录,首先大家都会想到采用group关键字分组,再利用max()函数获取最大的一条记录,但这样只能返回分组的字段,不能返回所有的字段,因此我在这里提供一种解决方法。 创建表语句 ?1234567891011121314151617181920212223242526[sql]USE[master] GO /******Object: Table[dbo].[Table_1] ScriptDate:08/05/201313
2、:21:28******/ SETANSI_NULLSON GO SETQUOTED_IDENTIFIERON GO SETANSI_PADDINGON GO CREATETABLE[dbo].[Table_1]( [id][int]NOTNULL, [pid][int]NOTNULL, [op_type][varchar](50)NOTNULL, [op_time][datetime]NULL, [op_man][varchar](50)NULL )ON[PRIMARY] GO
3、 SETANSI_PADDINGOFF GO 向表中插入测试数据 ?1234567[sql]insertinto[master].[dbo].[Table_1]([id],[pid],[op_type],[op_time],[op_man])values( 1 , 1 , '手动' , '2013-03-0500:00:00.000' , 'A'); insertinto[master].[dbo].[Table_1]([id],[pid],[op_type],[op_time],[op_man])values( 2 , 1
4、 , '自动' , '2013-05-0500:00:00.000' , 'B'); insertinto[master].[dbo].[Table_1]([id],[pid],[op_type],[op_time],[op_man])values( 3 , 2 , '手动' , '2013-06-0600:00:00.000' , 'A'); insertinto[master].[dbo].[Table_1]([id],[pid],[op_type],[op_time],[op_man])values( 4 ,
5、 1 , '手动' , '2013-06-0600:00:00.000' , 'A'); insertinto[master].[dbo].[Table_1]([id],[pid],[op_type],[op_time],[op_man])values( 5 , 1 , '自动' , '2013-06-0700:00:00.000' , 'A'); insertinto[master].[dbo].[Table_1]([id],[pid],[op_type],[op_time],[op_man])values( 6
6、 , 2 , '自动' , '2013-06-0700:00:00.000' , 'B'); 用select语句查询得到的结果 期望结果 开始我们都会采用分组和聚合函数的方式 ?1234[sql]SELECT[pid],max([op_time])asop_time FROM[master].[dbo].[Table_1] groupbypid 但这样得到的结果只能包含pid和op_time字段,不能包含这个表中所有的字段,因此我这里提供一种方法,对每个pid的数据进行排序,然后再取第一个 ?12345678[sql]se
7、lect*from ( SELECTt.*,ROW_NUMBER()over(partitionbyt.pidorderbyt.op_timedesc)num FROM[master].[dbo].[Table_1]t )a wherenum=1 GO