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

MySQL基于last_status最大值获取最新记录并创建Tableau可用视图

解决MySQL中按ID保留最新last_status记录的问题

你这个需求在数据可视化场景里太常见了——要给每个ID留最新状态的记录,避免Tableau里重复统计。你试过的关联子查询思路是对的,但我们可以优化得更简洁可靠,尤其是适配Tableau的使用场景。

方法一:用窗口函数实现(MySQL 8.0+推荐)

如果你的MySQL是8.0及以上版本,ROW_NUMBER()窗口函数是处理这类分组取最值的最优解,代码更清爽,性能也更稳定,还能完美适配Tableau的视图需求:

CREATE VIEW vw_latest_total_report AS
SELECT *
FROM (
    SELECT 
        *,
        -- 按ID分组,把每个ID下的记录按last_status从新到旧编号
        ROW_NUMBER() OVER (
            PARTITION BY ID 
            ORDER BY STR_TO_DATE(last_status, '%d/%m/%Y') DESC
        ) AS record_rank
    FROM total_report
) ranked_records
WHERE record_rank = 1; -- 只保留每个ID下编号为1的最新记录

关键细节:

  • 你的last_status是字符串格式的日期(比如09/08/2020),直接用字符串排序会踩坑(比如12/01/2020会被当成比01/02/2020小),所以必须用STR_TO_DATE()转成日期类型再排序。
  • 创建这个视图后,你直接在Tableau里连接vw_latest_total_report就行,视图会自动返回去重后的最新记录,不用在Tableau里再做复杂计算。

方法二:兼容MySQL 5.x的方案

如果你的MySQL版本还停留在5.x,不支持窗口函数,那可以优化你原来的关联查询,同样解决日期排序的问题:

CREATE VIEW vw_latest_total_report AS
SELECT s1.*
FROM total_report s1
INNER JOIN (
    SELECT 
        ID,
        -- 先转日期再取最大值,保证拿到的是真正最新的日期
        MAX(STR_TO_DATE(last_status, '%d/%m/%Y')) AS latest_status_date
    FROM total_report
    GROUP BY ID
) s2 
    ON s1.ID = s2.ID 
    AND STR_TO_DATE(s1.last_status, '%d/%m/%Y') = s2.latest_status_date;

额外提醒

如果同一个ID存在多条last_status完全相同的记录,上面的方法会:

  • 窗口函数方案:随机保留其中一条
  • 关联子查询方案:保留所有同日期的记录
    如果需要精准控制这种情况,可以在排序时再加一个辅助字段(比如某个更新时间戳),确保唯一取到一条记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:42:49