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


    先创建Students表

    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

    结果如下图:

     

    根据上面又延伸出来一个新需求。

    求一天之内的最大值最小值   最大值时间最小值时间

    select name,d '日期',maxAge,maxAddTime,minage,minAddTime from
    (
              select distinct name,d,
              maxAge, max(case maxAgenum when 1 then addtime else '' end) over(partition by name,d) maxAddTime ,
              minage,max(case minAgenum when 1 then addtime else '' end) over(partition by name,d) minAddTime
              from
             (
                  select name,addtime,DAY(addtime) d,
                  max(age) over(partition by name,DAY(addtime)) maxAge,
                  min(age) over(partition by name,DAY(addtime)) minAge,
                  RANK() over(partition by name,DAY(addtime) order by age desc) maxAgeNum ,
                  RANK() over(partition by name,DAY(addtime) order by age ) minAgeNum from students where addtime>='2017-5-1' and addtime<'2017-6-1'
             ) s
    ) a order by name,d

  • 相关阅读:
    MySQL高级(十五)--- 主从复制
    MySQL高级(十四)--- 行锁
    MySQL高级(十三)--- 表锁
    MySQL高级(十二)--- 全局查询日志
    MySQL高级知识(十一)--- Show Profile
    MySQL高级(十)--- 批量插入数据脚本
    MySQL高级(九)--- 慢查询日志
    MySQL高级(八)--- ORDER BY优化
    MySQL高级(七)--- 索引面试题分析
    SpringBoot系列教程web篇之如何自定义参数解析器
  • 原文地址:https://www.cnblogs.com/jiumei1/p/9004040.html
Copyright © 2020-2023  润新知