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

----------------------------------------------
--有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查询语句即把刚插入的合同日期最大的那条数据显示出来

时间: 2024-10-21 09:20:25

SQL分组取指定字段最大值的记录的相关文章

Sql server 取当天或当月的记录

  jsp向数据库中添加日期 MS SQL SERVER: NSERT into student(studentid,time1)values('15',getdate()); MY SQL insert into tablename (fieldname) values (now()) 取得数据库某表的所有行数 Connection conn=DbConnection.connectToDb(); Statement stat=conn.createStatement(); ResultSet

SQL Server之指定字段显示固定的长度

  SQLserver之指定字段显示固定的长度,这个平时显示数据的时候经常用到,但是记性不好,经常忘记. 故写于此,以便有用的时候捡起来. 这里举个例子,如有一个Article表,里面有3个字段 展示的时候因为某些原因,标题,内容不能显示过长,这里设置不能超过11个,其余用"..."代替,内容文字不能超过30个,否则用"..."代替: select ArticleTitle= case when len(ArticleTitle)>11 then substr

sql分组取最大记录方法

先看看group by 语句的用法 GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 点击可查看源文  代码如下 复制代码 SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name 在SQL的 语句一起使用同样数目的SQL聚合函数提

解析如何用SQL语句在指定字段前面插入新的字段

create proc addcolumn @tablename varchar(30), --表名 @colname varchar(30), --要加的列名 @coltype varchar(100), --要加的列类型 @colid int --加到第几列 as declare @colid_max int declare @sql varchar(1000) --动态sql语句 -------------------------------------------------- if n

解析如何用SQL语句在指定字段前面插入新的字段_MsSql

create proc addcolumn@tablename varchar(30), --表名@colname varchar(30), --要加的列名@coltype varchar(100), --要加的列类型@colid int --加到第几列as declare @colid_max intdeclare @sql varchar(1000) --动态sql语句--------------------------------------------------if not exist

SQL排除重复结果只取字段最大值分享_MsSql

如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条). 复制代码 代码如下: select * from [Sheet1$] awhere  ID not exists (select 1 from [Sheet1$] where PID=a.PID and ID>a.ID) select a.* from [Sheet1$] a inner join (select PID,max(ID) as max_id from [Sheet1$]

SQL排除重复结果只取字段最大值分享

如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条).复制代码 代码如下:select * from [Sheet1$] awhere  ID not exists (select 1 from [Sheet1$] where PID=a.PID and ID>a.ID) select a.* from [Sheet1$] a inner join (select PID,max(ID) as max_id from [Sheet1$] gr

PHP以指定字段为索引返回数据库所取的数据数组

很多情况下,我们从接触一个新的项目到开发完成,再回过头来仔细浏览一下自己写的代码,很多都是我们以前用熟练的代码.所以,在完成每个新项目的时 候,适当的做些项目总结.代码总结,或许你会在以后的项目中用得着,极有可能获得意外的收获,比如:代码优化,想到了更好.速度更快的实现方法等等. 牛逼的程序开发者有时候不在于代码量的多少,而是程序的代码简洁性.逻辑复杂但实现的方便性,这些才说明是否是一位好的程序员.我们不做日夜加班到深夜,拼代码量的程序员! 这篇和大家分享几个使用得PHP编程技巧,有些技巧是在看

分页-mysql某个字段排序后按这个字段分组取前10个的数据

问题描述 mysql某个字段排序后按这个字段分组取前10个的数据 需求是按某个字段分组,再按分组分页,取出每页分组里的所有数据. 例如表数据 Id 组名 1 A 2 A 3 B 4 A 5 B 6 C 7 F 8 C 9 D 10 E 11 F 每页取两组数据,第一页结果是 Id 组名 1 A 2 A 4 A 3 B 5 B 第二页结果是 Id 组名 6 C 8 C 9 D 第三页结果是 Id 组名 10 E 7 F 11 F 这有办法用一条sql查吗 解决方案 不知道你的分组的依据是什么,至于