MySQL获取GROUP最后一条数据

with t1 as (
SELECT
    hospital_ids AS hospital_id,
    operation_type_id AS bd_id,
    row_number() over(PARTITION by hospital_ids order by id desc) as rn
FROM
    tb_hospital_bd_log
WHERE
    operation_type = 2

)
SELECT *
from t1 WHERE rn = 1

### 如何在MySQL中使用GROUP BY获取每个分组的最后一条记录 在MySQL中,如果需要通过`GROUP BY`获取每个分组的最后一行数据,可以结合子查询和排序操作来实现。以下是具体方法: 1. **使用子查询与排序** 在子查询中对数据按照指定列(如时间戳或ID)进行降序排序,确保最新的记录排在前面。然后,在外部查询中使用`GROUP BY`来获取每组的第一条记录(即排序后的最后一条记录)。例如,以下SQL语句展示了如何获取每个分组的最后一行数据[^1]: ```sql SELECT t.* FROM ( SELECT * FROM message_detail ORDER BY id DESC ) t WHERE t.company_id = 1 GROUP BY t.message_kind_code; ``` 2. **使用`MAX()`函数与连接** 另一种方法是利用`MAX()`函数找到每组的最大值(如时间戳或ID),然后通过连接(JOIN)获取对应的整行数据。这种方法适用于需要获取完整行信息的场景[^3]。示例如下: ```sql SELECT t1.event_id, t1.create_time FROM monitor_company_event t1 INNER JOIN ( SELECT company_name, row_key, event_subType, MAX(create_time) AS max_time FROM monitor_company_event GROUP BY company_name, row_key, event_subType ) t2 ON t1.company_name = t2.company_name AND t1.row_key = t2.row_key AND t1.event_subType = t2.event_subType AND t1.create_time = t2.max_time; ``` 3. **解决高版本MySQL中的限制** 在MySQL 5.7及以上版本中,默认启用了`ONLY_FULL_GROUP_BY`模式,这会阻止非聚合字段出现在`SELECT`列表中。因此,如果直接使用`GROUP BY`可能会报错。为了解决这一问题,可以通过修改SQL模式或使用上述方法中的子查询来规避此限制[^4]。 4. **注意事项** - 默认情况下,`GROUP BY`返回的是每组的第一个记录,但这个记录不一定是最新的。因此,必须显式地进行排序以确保结果正确[^1]。 - 如果需要获取每个分组中大于一条数据的最新记录,可以结合`HAVING COUNT(*) > 1`条件[^2]。 ### 示例代码 以下是一个综合示例,展示如何获取每个分组的最后一条记录: ```sql SELECT t.* FROM ( SELECT * FROM test ORDER BY test_id DESC ) t GROUP BY t.test_user_id; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值