mysql分组获取最大时间的数据

本文探讨了两种SQL查询方法,一种是使用子查询结合联接来获取每个贷款编号下最新的贷款时间记录,这种方法查询速度快;另一种是通过ORDER BY和LIMIT进行分组,但存在局限性且效率较低。文章通过实践对比,推荐了更高效的查询策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SELECT
    * 
FROM
    customer_loan_info tb1,
    ( SELECT loan_no, max( loan_time ) AS loan_time FROM customer_loan_info GROUP BY loan_no ) tb2 
WHERE
    tb1.loan_no = tb2.loan_no 
    AND tb1.loan_time = tb2.loan_time

这个子查询可以查到分组后的编号和最大时间,但是这两个信息并不是一条数据的信息,再关联一下就可以得到具体记录了,这样查询的速度比较快

SELECT loan_no, max( loan_time ) AS loan_time FROM customer_loan_info GROUP BY loan_no

通过看博客还了解到另一种方法:

SELECT
    * 
FROM
    ( SELECT * FROM customer_loan_info ORDER BY loan_time DESC LIMIT 1000000000 ) tb1 
GROUP BY
    tb1.loan_no

但是LIMIT 1000000000总觉得不好,如果有一天数据超过了这个值还要改SQL,而且测了一下上面的方法比下面的快些

### 如何在 MySQL 中按分组获取计数最大的三条记录 要在 MySQL 中实现按分组获取每组 `count` 最大的三条记录,可以通过组合使用子查询、窗口函数以及连接操作来完成。以下是具体的解决方案: #### 解决方案描述 为了达到目标,可以按照以下逻辑构建 SQL 查询语句: 1. 使用 `GROUP BY` 对数据进行分组并计算每组的记录数量。 2. 利用子查询或者窗口函数(如果支持)提取每组中具有最大计数值的前三条记录。 假设有一个名为 `orders` 的表,其中包含字段 `customer_id`, `order_id` 和其他相关信息。我们希望找到每个客户的前三笔订单量最多的记录。 #### 示例代码 ```sql -- 步骤 1: 计算每组 (customer_id) 下 order_id 的数量 WITH OrderCounts AS ( SELECT customer_id, order_id, COUNT(order_id) OVER (PARTITION BY customer_id ORDER BY order_id DESC) AS rank_count FROM orders ), RankedOrders AS ( -- 步骤 2: 排序并标记排名 SELECT customer_id, order_id, RANK() OVER (PARTITION BY customer_id ORDER BY COUNT(*) DESC) AS rnk FROM orders GROUP BY customer_id, order_id ) -- 步骤 3: 提取每组 top 3 的记录 SELECT customer_id, order_id FROM RankedOrders WHERE rnk <= 3; ``` 此代码片段通过以下几个部分实现了需求: - **OrderCounts**: 首先利用窗口函数 `COUNT()` 来统计每个客户下的订单数量,并对其进行降序排列[^1]。 - **RankedOrders**: 借助 `RANK()` 函数为每个客户的订单分配一个基于其频率的排名[^4]。 - **最终筛选**: 只保留那些排名小于等于三的结果集作为输出[^5]。 需要注意的是,在某些版本较低的 MySQL 中可能不完全支持上述语法中的窗口函数功能,则需改写成传统方式实现相同效果: ```sql SELECT t.customer_id, t.order_id FROM ( SELECT o.customer_id, o.order_id, @row_num := IF(@prev_customer = o.customer_id, @row_num + 1, 1) AS rn, @prev_customer := o.customer_id FROM ( SELECT customer_id, order_id FROM orders GROUP BY customer_id, order_id ORDER BY customer_id ASC, COUNT(*) DESC ) o JOIN (SELECT @row_num:=0, @prev_customer='') vars ) t WHERE t.rn <= 3; ``` 这里采用了变量机制模拟了窗口函数的行为以适应更广泛的数据库环境[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值