一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

SQL分组取指定字段最大值的记录

时间:2015-04-10 编辑:简简单单 来源:一聚教程网

----------------------------------------------
--有id,name,createDate的一张表testTable
--根据name分组,获取每组中createDate最大的那条记录(整条)查询出来

----------------------------------------------
创建一张表,语句如下:


CREATE TABLE [dbo].[testTable] 

[id] [int] NOT NULL IDENTITY(1, 1), 
[name] [nchar] (10) COLLATE Chinese_PRC_CI_AS NULL, 
[counts] [int] NULL, 
[createDate] [datetime] NULL 

GO 
-- Constraints and Indexes 
ALTER TABLE [dbo].[testTable] ADD CONSTRAINT [PK_testTable] PRIMARY KEY CLUSTERED ([id]) 
GO 

 
插入测试数据:

insert into testTable(id,name,counts,createDate) values(1,'A         ',20,'01 14 2011 10:52PM') 
insert into testTable(id,name,counts,createDate) values(2,'A         ',10,'02 14 2011 10:52PM') 
insert into testTable(id,name,counts,createDate) values(3,'B         ',20,'03 14 2011 10:52PM') 
insert into testTable(id,name,counts,createDate) values(4,'B         ',40,'04 14 2011 10:52PM') 
insert into testTable(id,name,counts,createDate) values(5,'B         ',10,'05 14 2011 10:52PM') 
insert into testTable(id,name,counts,createDate) values(6,'C         ',20,'06 14 2011 10:52PM') 
insert into testTable(id,name,counts,createDate) values(7,'C         ',40,'07 14 2011 10:52PM') 

 

查询SQL语句:


select * from ( 
 select id,name,counts,createDate,row_number() over(partition by name order by createDate desc) rn 
 from testTable 
) t where t.rn <=1 

 
效果如下

例子2

编号  姓名  合同日期

100   张三  1985-5-1
100   张三  1986-5-1
101   李四  1985-5-1
101   李四  1999-5-1

求以编号分组查出合同日期的最大值记录.结果就应该是

100   张三  1986-5-1
101   李四  1999-5-1

请写出最简单效率最高的SQL查询语句.试用成功后加分

select 编号,姓名,max(合同日期)
from table
group by 编号,姓名
order by 合同日期;

--测试数据:

SQL> select * from a;
 
        NO NAME                 HT
---------- -------------------- -----------
 
SQL> select * from a;
 
        NO NAME                 HT
---------- -------------------- -----------
       100 张三                 1985-5-1
       100 张三                 1986-5-1
       101 李四                 1985-5-1
       101 李四                 1999-5-1
 
SQL>
SQL> select no,name,max(ht)
  2  from a
  3  group by no,name
  4  ;
 
        NO NAME                 MAX(HT)
---------- -------------------- -----------
       100 张三                 1986-5-1
       101 李四                 1999-5-1
 
SQL> insert into a values(100,'张三',to_date('1999-5-1','yyyy-mm-dd'));
 
1 row inserted
 
SQL> select * from a;
 
        NO NAME                 HT
---------- -------------------- -----------
       100 张三                 1985-5-1
       100 张三                 1986-5-1
       101 李四                 1985-5-1
       101 李四                 1999-5-1
       100 张三                 1999-5-1
 
SQL>
SQL> select no,name,max(ht)
  2  from a
  3  group by no,name;
 
        NO NAME                 MAX(HT)
---------- -------------------- -----------
       100 张三                 1999-5-1
       101 李四                 1999-5-1

新插入了一条数据之后,使用该sql查询语句即把刚插入的合同日期最大的那条数据显示出来

热门栏目