数据按某个字段分组,且取每个分组的最大值

本文介绍了一种使用SQL查询来获取特定推送ID下最新的状态记录的方法。通过使用窗口函数ROW_NUMBER()并结合PARTITION BY和ORDER BY子句,可以有效地从数据库中筛选出每个状态类型的最后一条记录。
select 
push_id AS pushId,
device_id AS deviceId,
"timestamp" AS statusTime,
status_type AS statusType 
from (
select ROW_NUMBER() over(partition by status_type order by "timestamp" desc nulls last) RowNum
  ,pamip_status.*
  from pamip_status where push_id ='57c792ad67dc4ec3612da00c' )t where rownum =1
使用 SQL 按照某个字段分组每组第一条数据,不同场景有不同的实现方法: ### 通用场景(以 SQL Server 或支持窗口函数的数据库为例) 假设存在表 `TABLE_A` ,需要对 `TABLE_A` 中的 `kind` 字段进行分组,并对分组按照 `kind_num` 排序,每个分组的第一条数据,可借助 `ROW_NUMBER()` 窗口函数实现。 ```sql SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY KIND ORDER BY KIND_NUM DESC) AS NEW_INDEX, * FROM TABLE_A ) subquery WHERE NEW_INDEX = 1; ``` 上述代码中,`ROW_NUMBER()` 函数根据 `KIND` 字段进行分区,在每个分区内按 `KIND_NUM` 降序排序,并为每行分配一个序号 `NEW_INDEX`。外层查询筛选出 `NEW_INDEX` 为 1 的记录,即每个分组的第一条数据 [^1]。 ### MySQL 场景(按某个字段分组每个分组中某个字段最大值的一条数据) 若要将 `test_sql` 表按 `sex` 进行分组,每组只保留 `age` 最大数据,可使用如下 SQL: ```sql SELECT any_value(id) as id, any_value(age) as age, sex FROM ( SELECT id, age, sex FROM test_sql HAVING 1 ORDER BY age DESC ) a GROUP BY a.sex; ``` 此 SQL 先对 `test_sql` 表按 `age` 降序排序,然后按 `sex` 字段分组,通过 `any_value()` 函数选所需字段,保留每组中 `age` 最大数据 [^4]。 ### MySQL 分组随机每组一条数据 若要从 `table` 表分组后随机获每组一条数据,可使用如下方法: ```sql SELECT * FROM `table` AS t1 JOIN ( SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id ) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1; ``` 该 SQL 通过生成一个随机的 `id`,从 `table` 表中筛选出 `id` 大于等于随机 `id` 的记录,并按 `id` 排序后第一条,以此实现随机每组一条数据的目的 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值