You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL分组查询:按p_id分组后如何获取对应最新日期的sub_id与status?

解答你的两个SQL问题

1. 查询每个sub_id对应的最新日期及状态

要获取每个sub_id对应的最新日期和状态,最通用且可靠的方法是使用窗口函数(比如ROW_NUMBER()),它能精准定位每个分组内的最新记录,几乎适用于所有现代数据库(MySQL 8.0+、PostgreSQL、SQL Server等)。

示例代码如下:

SELECT sub_id, dates, status
FROM (
    SELECT 
        sub_id, 
        dates, 
        status,
        ROW_NUMBER() OVER (PARTITION BY sub_id ORDER BY dates DESC) AS rn
    FROM table_name
) t
WHERE rn = 1;

简单解释下逻辑:

  • PARTITION BY sub_id:把数据按sub_id拆分成独立的分组
  • ORDER BY dates DESC:在每个分组内按日期倒序排列,最新的日期会排在最前面
  • rn = 1:筛选出每个分组里排名第一的记录,也就是对应最新日期的那条

如果你用的是旧版本MySQL(低于8.0),窗口函数不支持的话,可以用关联子查询的方式实现:

SELECT t1.sub_id, t1.dates, t1.status
FROM table_name t1
INNER JOIN (
    SELECT sub_id, MAX(dates) AS latest_date
    FROM table_name
    GROUP BY sub_id
) t2 ON t1.sub_id = t2.sub_id AND t1.dates = t2.latest_date;

这个方法先找出每个sub_id的最新日期,再通过关联原表拿到对应的状态。需要注意:如果同一个sub_id在同一天有多条记录,这个查询会返回所有这些记录;如果只需要一条,可以根据业务需求加额外的筛选条件。

2. 按p_id分组后正确返回status和sub_id字段

你的原SQL语句存在一个常见的分组查询误区:在标准SQL模式下(比如MySQL开启ONLY_FULL_GROUP_BY时),SELECT列表里的字段要么出现在GROUP BY子句中,要么被聚合函数(比如MAX()MIN())包裹,否则会抛出语法错误;即使某些数据库允许这种写法,返回的statussub_id也会是随机的,完全不可靠。

要正确返回每个p_id对应的statussub_id,通常我们的需求是获取每个p_id对应最新日期的这两个字段(毕竟你用到了MAX(dates)),这时依然可以用窗口函数来实现:

SELECT p_id, dates, status, sub_id
FROM (
    SELECT 
        p_id, 
        dates, 
        status,
        sub_id,
        ROW_NUMBER() OVER (PARTITION BY p_id ORDER BY dates DESC) AS rn
    FROM table_name
) t
WHERE rn = 1;

逻辑和第一个问题类似:按p_id分组,取每个组内日期最新的那条记录,这样就能精准拿到对应的statussub_id了。

如果不想用窗口函数,也可以用关联子查询的方式:

SELECT t1.p_id, t1.dates, t1.status, t1.sub_id
FROM table_name t1
INNER JOIN (
    SELECT p_id, MAX(dates) AS latest_date
    FROM table_name
    GROUP BY p_id
) t2 ON t1.p_id = t2.p_id AND t1.dates = t2.latest_date;

同样,这个方法会返回每个p_id最新日期对应的所有记录,如果有重复日期的情况,需要根据业务需求进一步筛选。

内容的提问来源于stack exchange,提问作者sygops

火山引擎 最新活动