关于SQL分组取最大值的几中方式

时间:2022-01-19 15:12:22

假如我们有这么一张表TbOrder具体数据结构如下图:

关于SQL分组取最大值的几中方式

如果想要查询出每个customerId的最近一天的订单记录,也就是说要如下结果:

关于SQL分组取最大值的几中方式

实现语句如下:

select * from (select id,
orderId,
goodsName,
orderDate,
price,
customerId,
ROW_NUMBER() over(partition by Customerid order by orderDate desc)as rn
               from TbOrder) t
 where t.rn<=1

我们来分析一下这语句,主要用到了两个查询,其中子查询中使用了over开窗函数和Row_Number()函数,over函数用法和介绍请参照 点击这里 之前的一篇文章,Row_number函数功能主要是给行记录生成序列号,这种实现方式重点在于<strong>ROW_NUMBER() over(partition by Customerid order by orderDate desc)</strong>,我们来解释一下这段语句的功能,以orderDate降序,CustomerId为分组条件,使用row_number函数为所分的每个组生成序列号,这样每个Customerid中orderdate 最近的序号肯定为1,接下来大家肯定都明白了,查询出为1的记录就是最近的订单记录了。

 但是悲剧的事情发生了,正当我准备使用以上语句实现这个功能的时候,发现数据库是SQL Server2000的,不支持Row_number和over函数,怎么办呢,百度呗,得出以下结果,使用相关子查询:

select Tb.* from TbOrder Tb
                   where not exists
                  (select 1 from TbOrder where customerId=Tb.customerId and (orderDate>Tb.orderDate))


由于自己基础知识差,恶补了一下子查询的的工作方式,大家有兴趣的话点击这里可以查看,一直以为not exists的功能是查询出不存在于子查询中的记录,其实直的查询依据并不是这个,而是当子查询中有记录返回时 not exists结果为FALSE但子查询没有记录返回时not exists值才为True,exists正好相反。特写此文以备忘。