首页 > 数据库 >SQL 分组(分区)排序获取第一条数据 ROW_NUMBER() OVER() PARTITION BY的使用

SQL 分组(分区)排序获取第一条数据 ROW_NUMBER() OVER() PARTITION BY的使用

时间:2023-01-05 10:11:46浏览次数:45  
标签:分区 PARTITION NUMBER SQL 排序 id ROW

有一张价格 “订单价格设置” 表如下:

商品编号,价格设置时间id(类似于创建时间,创建时间约早,则act_id越小) ,价格的时间段,商品价格

 

现在要求选出每个商品价格最大,价格设置时间id最大的那条记录,要求先考虑价格,再考虑设置时间 

理想的结果:取出的是第3条记录 和第5条记录

思路:将数据根据item分区,再在每个分区中进行排序,先根据价格排序,再根据设置时间id排序,最后取出每个分组的第一条记录

实现:

利用 ROW_NUMBER() OVER(),PARTITION BY,ORDER BY

先直接上代码:

  1.   select item,act_id,loc_id,start_date,end_date,price,
  2.   ROW_NUMBER() over( partition by item order by price desc,act_id desc) as new_index
  3.   from test1

查询结果如下

 

可以看到查询出的结果已经进行了分区和进行了一次排序,并且增加了排序标记new_index

接下来只需从结果中查出new_index = 1的记录即为我们想要的结果:

  1.   select * from
  2.   (select item,act_id,loc_id,start_date,end_date,price,
  3.   ROW_NUMBER() over( partition by item order by price desc,act_id desc) as new_index
  4.   from test1)b where b.new_index = 1

结果如下:

 

ROW_NUMBER() OVER()和 PARTITION BY

① ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,可多个字段

在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

② PARTITION BY 分区函数可以根据某字段分区并返回所有结果集,作为分区函数一般与Row_Number() over()排序一起连用,可实现分区排序的功能

它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。

标签:分区,PARTITION,NUMBER,SQL,排序,id,ROW
From: https://www.cnblogs.com/Andy-Blog/p/17026772.html

相关文章

  • HTML5 Web SQL 数据库简介
    WebSQL数据库API并不是HTML5规范的一部分,但是它是一个独立的规范,引入了一组使用SQL操作客户端数据库的APIs。WebSQL数据库可以在最新版的Safari,Chrome和Ope......
  • postgresql/lightdb OVERLAPS 和 BETWEEN SYMMETRIC函数介绍
    PostgreSql/lightdb中有两个非常方便、有用的比较操作,OVERLAPS和BETWEENSYMMETRIC。1.OVERLAPS(重叠)OVERLAPS操作,用于检测两个日期范围是否重叠。举例:SELECT(......
  • mysql删除重复数据
    一个bug导致的一张日志表出现大量重复数据,需要删除重复数据,神仙sql如下,sql过于复杂把navicate的sql美化器都给整不会了,美化不出来,执行结果这条sql删除了75万条数据:DELETE......
  • postgresql/lightdb中覆盖自增列值
    PostgreSQL里的自动生成标识列identitycolumn和自动生成存储列generatedcolumn是非常不错的功能,不过他们的实现语法比较近似,容易弄混,本文将进行示例介绍。PGv10:......
  • 【MySQL 8】MySQL 5.7都即将停只维护了,是时候学习一波MySQL 8了【转】
    MySQL8新特性选择MySQL8的背景:MySQL5.6已经停止版本更新了,对于MySQL5.7版本,其将于2023年10月31日停止支持。后续官方将不再进行后续的代码维护。另外,MySQL8.0......
  • SQL Access group by 使用注意事项
    SQLAccessgroupby使用注意事项在MSSQL中正常的语句:selectField1,sum(Field2)asField2nfromTableswheregroupbyField1orderbyField2desc在Access......
  • Windows忘记Mysql8密码重置
    先关掉系统服务。在mysql8系统,用mysqld--console--skip-grant-tables--shared-memory可以无密码启动服务。服务启动后,打开另一个cmd。以空密码登入系统。mysql-ur......
  • SQL基础一
    SQL是访问和处理关系数据库的计算机标准语言。数据库模型:层次模型、网状模型、关系模型关系型数据库目前,主流的关系数据库主要分为以下几类:商用数据库,例如:Oracle,SQLS......
  • centos7 安装 MySQL
    首先登陆MySQL官网。点击downloads。https://dev.mysql.com/downloads/这里我选择的是社区版。之后出现了很多选项。根据需求选择。因为我是centos,一开始准备使用y......
  • MySQL索引
    面试题整理-MySQL索引MySQL#1.什么是索引-官方定义:一种帮助mysql提高查询效率的数据结构-索引的优点:1、大大加快数据查询速度-索引的缺点:1......