按ID统计实例数量并获取最后出现记录的SQL实现需求
解决按ID统计实例数量并获取最后出现记录的SQL方案
嘿,我来帮你搞定这个SQL需求!针对你的exports表,要同时实现按ID统计实例数量和获取每个ID的最后出现记录,这里有两种实用的方案,适配不同的数据库场景:
方案一:用窗口函数(推荐,高效且逻辑清晰)
这个方案适合支持窗口函数的数据库(比如MySQL 8+、PostgreSQL、SQL Server等),一步到位就能拿到你要的结果:
WITH id_stats AS ( SELECT *, -- 按ID分区,统计每个ID对应的总实例数 COUNT(*) OVER (PARTITION BY id) AS instance_count, -- 给每个ID的记录按时间倒序排号,rn=1就是最后出现的那条 ROW_NUMBER() OVER (PARTITION BY id ORDER BY record_time DESC) AS rn FROM exports ) SELECT id, instance_count, -- 这里替换成你需要的最后记录的业务字段 content, status, record_time AS last_appear_time FROM id_stats WHERE rn = 1;
说明:
- 临时结果集
id_stats会给每个ID的所有记录都带上该ID的总实例数,同时给每条记录按时间倒序编号。 - 最后筛选
rn=1的行,就得到了每个ID的最新记录和对应的实例总数。 - 如果你的表用自增主键(比如
seq_id)判断最新记录,把ORDER BY record_time DESC换成ORDER BY seq_id DESC就行。
方案二:分组关联(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用分组+关联的方式实现:
SELECT e.id, s.instance_count, e.content, e.status, e.record_time AS last_appear_time FROM exports e INNER JOIN ( -- 先按ID分组,统计数量并拿到每个ID的最新时间 SELECT id, COUNT(*) AS instance_count, MAX(record_time) AS last_appear_time FROM exports GROUP BY id ) s ON e.id = s.id AND e.record_time = s.last_appear_time;
注意:
- 如果同一个ID在同一时间有多条记录,这个查询会返回多条结果。如果需要唯一的最后记录,可以在子查询里加上
MAX(seq_id)(假设seq_id是自增主键),然后关联时加上e.seq_id = s.max_seq_id。
内容的提问来源于stack exchange,提问作者Spatial_TX
相关产品推荐
相关产品推荐

