You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两条SQL查询,在同一结果中展示最新记录及对应名称的出现次数?

合并最新记录查询与名称出现次数统计的解决方案

嘿,我来帮你搞定这个问题!你想要同时获取每个Name的最新记录,以及该名称在表中的总出现次数,其实有两种实用的方法可以实现,咱们一步步来看:

方法一:使用JOIN关联子查询

这种方法兼容性拉满,几乎所有数据库都能支持。核心思路是把你原来的「获取最新记录」查询作为主表,再关联一个统计名称次数的子查询,通过Name字段匹配即可:

SELECT 
    u1.TimeStamp,
    u1.Name,
    u1.Status,
    u1.Station,
    u1.Role,
    u1.Line,
    name_counts.count AS total_occurrences
FROM trs_contact u1
LEFT JOIN (
    SELECT Name, COUNT(*) AS count
    FROM trs_contact
    GROUP BY Name
) name_counts ON u1.Name = name_counts.Name
WHERE u1.TimeStamp = (
    SELECT MAX(TimeStamp) 
    FROM trs_contact u2 
    WHERE u1.Name = u2.Name
);

简单解释:

  • 子查询name_counts专门负责统计每个Name的总出现次数,靠GROUP BY Name分组计算
  • 主查询保留你原来获取最新记录的逻辑,通过LEFT JOIN把次数统计结果关联进来,确保每个最新记录都能对应到它的总次数

方法二:使用窗口函数(推荐,适用于支持窗口函数的数据库)

如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),这种方法更简洁高效,只需要一次扫描表就能完成两个需求:

SELECT 
    TimeStamp,
    Name,
    Status,
    Station,
    Role,
    Line,
    total_occurrences
FROM (
    SELECT 
        TimeStamp,
        Name,
        Status,
        Station,
        Role,
        Line,
        COUNT(*) OVER(PARTITION BY Name) AS total_occurrences,
        ROW_NUMBER() OVER(PARTITION BY Name ORDER BY TimeStamp DESC) AS rn
    FROM trs_contact
) t
WHERE rn = 1;

简单解释:

  • COUNT(*) OVER(PARTITION BY Name):按Name分组,直接统计每个组的总记录数,也就是该名称的出现次数
  • ROW_NUMBER() OVER(PARTITION BY Name ORDER BY TimeStamp DESC):按Name分组后,给每条记录按TimeStamp降序排号,最新的记录会拿到rn=1的标记
  • 外层查询只保留rn=1的记录,也就是每个Name的最新记录,同时带上统计好的总次数

这两种方法都能完美实现你的需求,你可以根据自己的数据库版本和性能偏好选择~

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:02:43