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

结果如下图:

原文地址:https://www.cnblogs.com/jiuxia/p/9004040.html

时间: 2024-10-27 17:41:06

sql server求分组最大值,最小值,最大值对应时间,和最小值对应时间的相关文章

SQL SERVER 实现分组合并实现列数据拼接

需求场景: SQL SERVER 中组织的数据结构是一个层级关系,现在需要抓出每个组织节点以上的全部组织信息,数据示例如下: ADOrg_ID--------------ParentID-----------------ShortName 001                                                                 顶级组织名称 001.021                     001                        

sql server如何分组编号

我们在生产实践中经常会有这样的需求:分组编号. 如下有一个城市区域表region: 我们需要对上表region按city分组,对region进行排序,得到如下结果: 具体sql如下: 1 select city,region, 2 right('100'+row_number()over(partition by city order by region),2) as region_no 3 from region 此方法主要是运用over函数通过对city进行分组后,再对region进行排序(

sql server 增加分组序号

SQL2000自制row_number SELECT (SELECT COUNT(*) FROM main1 p1 WHERE p1.编号 <= p2.编号) AS rowNumber, *  FROM main1 p2  ORDER BY 编号 很简单,但是数据量大的时候会十分的消耗性能 sql server2005以后 ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)原创置顶 一彡十 最后发布于2018-09-18 19:11:38 阅读数 92385 收藏展开 和彡

SQL Server 求结果

;with cte as ( select  CONVERT(DATE, DATEADD(DAY, -9, GETDATE())) as paytime union all select dateadd(day,1,paytime) from cte where paytime<GETDATE() ) select * from cte a -----------猜猜结果是什么,下面的 paytime2015-10-312015-11-012015-11-022015-11-032015-11-

SQL SERVER根据出生年月、性别、身份计算年龄、内退时间

SELECT     dbo.ygb.ygbm, dbo.ygb.ygxm, dbo.ygb.ygxb, dbo.ygb.ygmz, dbo.ygb.sfid, dbo.ygb.zzmm, dbo.ygb.ygsr, YEAR(GETDATE()) - YEAR(dbo.ygb.ygsr) AS ygnl,                       dbo.ygb.gzsj, CASE WHEN ygxb = '1' THEN DATEDIFF(day, GETDATE(), DATEADD(

.Net Framework 与 SQL Server 2005 混乱的时间最大最小值

http://blog.csdn.net/jiwenyi163/article/details/2973100 .Net Framework 与 SQL Server 2005 混乱的时间最大最小值 之前才跟 dotjum 聊到 Microsoft 在 DateTime 還有 SQL Server 2005 的最小最大時間非常地不一致,沒想到果然有人也碰過相同的困擾. 參考: C# DateTime.MinValue is not the same as SqlDateTime.MinValue

sql server——分组查询(方法和思想)

思想 先排序在汇总 sql server里分组查询通常用于配合聚合函数,达到分类汇总统计的信息.而其分类汇总的本质实际上就是先将信息排序,排序后相同类别的信息会聚在一起,然后通过需求进行统计计算. 使用GROUP BY进行分组查询 实例演示 --查询男女生的人数 在没有学习分组查询之前,我们可以安装常规的思路解决查询需求: select count(*) from student where sex='男' select count(*) from student where sex='女' 那

数据库开发基础-SQl Server 聚合函数、数学函数、字符串函数、时间日期函数

SQL 拥有很多可用于计数和计算的内建函数. 函数的语法 内建 SQL 函数的语法是: SELECT function(列) FROM 表 函数的类型 在 SQL 中,基本的函数类型和种类有若干种.函数的基本类型是: Aggregate 函数 Scalar 函数 合计函数(Aggregate functions) Aggregate 函数的操作面向一系列的值,并返回一个单一的值. 注释:如果在 SELECT 语句的项目列表中的众多其它表达式中使用 SELECT 语句,则这个 SELECT 必须使

SQL Server常语法语句操作

SQL Server语句操作 --1.获取表的主键字段SELECT name FROM SysColumns WHERE id=Object_Id('表名') and colid=(select top 1 colid from sysindexkeys where id=Object_Id('表名')) select A.COLUMN_NAME  from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE A join(select * from sysob