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

MySQL内连接表获取最新2条记录的字段匹配异常问题

问题描述

需查询活跃企业的最新2条记录用于可视化,要返回字段:企业名称、最新日期、最新记录的本地存储百分比、次新日期、次新记录的本地存储百分比。当前查询存在匹配错误:最新日期对应的存储百分比与次新记录的百分比一致,未正确关联对应日期的数值。

表结构

USERS TABLE

idcompany_nameusr_activedatto_host
1Company A1companyA
2Company B1companyB
3Company C1companyC

DATTO Table

iddevice_modeldate_recordedlocal_storage_percenthost
106ModelA2023-03-2395%companyA
108ModelA2023-03-2283%companyA
111ModelC2023-03-2390%companyC

当前查询语句

select datto.device_model,  users.company_name, max(date_recorded) as first_date, max(datto.local_storage_percent) as local_storage_percent_current,
   substring_index(substring_index(group_concat(date_recorded order by date_recorded desc), ',', 2), ',', -1) as second_date,
   substring_index(substring_index(group_concat(local_storage_percent order by local_storage_percent desc), ',', 2), ',', -1) as local_storage_percent_previous 
from datto inner join users on datto.host = users.datto_host  
where users.usractive = '1' 
group by users.company_name;

当前查询结果

device_modelcompany_namefirst_datelocal_storage_percent_currentsecond_datelocal_storage_percent_previous
ModelACompany A2023-03-2383%2023-03-2283%

期望查询结果

device_modelcompany_namefirst_datelocal_storage_percent_currentsecond_datelocal_storage_percent_previous
ModelACompany A2023-03-2395%2023-03-2283%

问题分析

  1. 过滤条件拼写错误:原查询中users.usractive应为users.usr_active,字段名错误会导致过滤逻辑失效或报错。
  2. 当前百分比取值逻辑错误:用max(local_storage_percent)取存储百分比最大值,无法关联最新日期对应的数值,因为最大值不一定属于最新记录。
  3. 次新百分比排序逻辑错误:按存储百分比字符串排序拼接,而非按日期排序后关联对应数值,导致次新日期与百分比不匹配。

解决方案

使用窗口函数ROW_NUMBER()按企业分组、日期降序标记记录顺序,再通过条件聚合提取最新和次新的对应值:

WITH ranked_records AS (
    SELECT 
        d.device_model,
        u.company_name,
        d.date_recorded,
        d.local_storage_percent,
        ROW_NUMBER() OVER (PARTITION BY u.company_name ORDER BY d.date_recorded DESC) AS record_rank
    FROM datto d
    INNER JOIN users u ON d.host = u.datto_host
    WHERE u.usr_active = 1
)
SELECT
    device_model,
    company_name,
    MAX(CASE WHEN record_rank = 1 THEN date_recorded END) AS first_date,
    MAX(CASE WHEN record_rank = 1 THEN local_storage_percent END) AS local_storage_percent_current,
    MAX(CASE WHEN record_rank = 2 THEN date_recorded END) AS second_date,
    MAX(CASE WHEN record_rank = 2 THEN local_storage_percent END) AS local_storage_percent_previous
FROM ranked_records
WHERE record_rank <= 2
GROUP BY company_name, device_model;

说明

  • ROW_NUMBER()为每个企业的记录按日期从新到旧标记序号,1对应最新记录,2对应次新记录。
  • 条件聚合CASE WHEN精准提取不同序号对应的日期和存储百分比,确保日期与数值正确关联。
  • 修正了原查询中usr_active的拼写错误,正确过滤活跃企业。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:02:47