sql server求分组最大值,最小值,最大值对应时间,和最小值对应时间

Posted jiuxia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server求分组最大值,最小值,最大值对应时间,和最小值对应时间相关的知识,希望对你有一定的参考价值。

先创建数据库

CREATE TABLE [dbo].[Students](
[Id] [int] IDENTITY(1,1) NOT NULL,
[age] [int] NULL,
[name] [nvarchar](50) NULL,
[addTime] [datetime]  NULL
) ON [PRIMARY]

 

插入几条测试数据

INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (22, N‘李四‘, ‘2015-04-08 01:00:00.000‘)
INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (8, N‘李四‘, ‘2017-05-03 00:00:00.000‘)
INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (98, N‘李四‘, ‘2017-10-03 00:00:00.000‘)
INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (34, N‘张三‘, ‘2016-09-08 00:00:00.000‘)
INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (45, N‘张三‘,‘2011-05-08 00:00:00.000‘)
INSERT [dbo].[Students] ( [age], [name], [addTime]) VALUES (5, N‘张三‘, ‘2014-04-01 00:00:00.000‘)

第一种写法:

  这种写法用到了窗口函数,窗口函数的行为描述出现在函数的OVER子句中,并涉及多个元素,3个核心元素分别是:分区,排序和框架

select distinct name,
maxAge, max(case maxAgenum when 1 then addtime else ‘‘ end) over(partition by name) maxAddTime ,
minage,max(case minAgenum when 1 then addtime else ‘‘ end) over(partition by name) minAddTime
from (
select name,addtime,
max(age) over(partition by name) maxAge,
min(age) over(partition by name) minAge,
RANK() over(partition by name order by age desc) maxAgeNum ,
RANK() over(partition by name order by age ) minAgeNum from students
) s

第二种写法:

with s as
(
select name,max(age) maxAge,min(age) minAge from students
group by name
)
select name,max(maxAge) maxAge,max(maxAgeTime) maxAgeTime,max(minAge) minAge,max(minAgeTime) minAgeTime from (
select ss.name,s.maxAge,ss.addTime maxAgeTime,0 minAge, ‘‘ minAgeTime from students ss inner join s on ss.name=s.name and ss.age=s.maxAge
union all
select ss.name,0 maxAge , ‘‘ maxAgeTime,s.minAge minAge,ss.addTime minAgeTime from students ss inner join s on ss.name=s.name and ss.age=s.minAge
) a group by name

 

结果如下图:

 技术分享图片

 

技术分享图片





























以上是关于sql server求分组最大值,最小值,最大值对应时间,和最小值对应时间的主要内容,如果未能解决你的问题,请参考以下文章

在SQL中以破坏序列升序/降序对结果最小值/最大值进行分组

08章 分组查询子查询原生SQL

在 SQL 第 2 部分中以破坏序列升序/降序对结果最小值/最大值进行分组

SQL Server中如何分组查询最大值

SQL 查询 - 分组并计算最大值 - 最小值

【SQL】根据一个字段分组求另一个字段的最大值,并带出其他字段