关于SQL分组取最大值的几中方式
来源:互联网 发布:二手警服淘宝 编辑:程序博客网 时间:2024/05/01 09:06
假如我们有这么一张表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正好相反。特写此文以备忘。
0 0
- 关于SQL分组取最大值的几中方式
- T-SQL取分组最大值记录
- oracle中分组排序并取最大值
- 关于MYSQL group by 分组按时间取最大值的实现方法!
- 关于MYSQL group by 分组按时间取最大值的实现方法!
- 关于MYSQL group by 分组按时间取最大值的实现方法
- 关于SQL Server分组取前N条的问题
- sql取分组的前两行
- sql分组查询每组的最大值
- sql分组统计、最大值
- SQL分组求最大值
- 数据分组取最大值行
- linq 分组取各组最大值
- 部落纪事: 一条关于求统计分组的最大值的sql
- SQL对取值范围进行分组汇总的几种办法
- sql server 分组,取每组的前几行数据
- SQL数据分组后取最大值或者取前几个值(按照某一列排序)
- SQL数据分组后取最大值或者取前几个值(按照某一列排序)
- 负载均衡调度算法
- Tomcat实战2【tomcat下配置多个域名来实现部署不同项目】
- 进程退出线程即结束的代码验证
- HTML学习笔记(六)
- 延迟加载机制
- 关于SQL分组取最大值的几中方式
- nmap扫描29方法
- tracert 路由跟踪
- Audio笔记之ServiceManager
- 阿里负责人揭秘面试潜规则
- SQLPLUS中应用参数查询
- poj 1017 packets 装箱问题
- HTML学习笔记(七)
- OpenGL 超级宝典学习,制作 圆柱,球体,花托,圆盘等多边体