假如我们有这么一张表TbOrder具体数据结构如下图:
如果想要查询出每个customerId的最近一天的订单记录,也就是说要如下结果:
实现语句如下:
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正好相反。特写此文以备忘。