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

如何查询id_konsul=4的数据并获取同staflow的最新created_at记录

解决方案:筛选指定id_konsul且每个staflow保留最新记录

嘿,我来帮你搞定这个SQL查询需求!首先明确你的核心需求:要筛选出id_konsul = 4的所有记录,并且当staflow值重复时,只保留对应created_at最新的那一条。

先回顾你提供的示例数据:

id id_konsul staflow created_at 
1  4         1       21/05/2018 11.03 
2  4         2       22/05/2018 11.03 
3  4         3       23/05/2018 11.03 
4  4         4       24/05/2018 11.03 
5  4         5       25/05/2018 11.03 
6  4         6       26/05/2018 11.03 
7  4         7       27/05/2018 11.03 
8  4         6       28/05/2018 11.03 
9  4         7       29/05/2018 11.03 
10 4         7       30/05/2018 11.03 
11 4         8       31/05/2018 11.03 

你期望的结果是每个staflow只留最新的那条,比如staflow=6保留id=8的记录,staflow=7保留id=10的记录。下面给你两种常用的实现方法:

方法一:使用窗口函数(推荐,清晰高效)

窗口函数是处理这类分组取最值问题的最优方案,这里用ROW_NUMBER()给每个staflow分组内的记录排序:

WITH ranked_records AS (
    SELECT 
        *,
        -- 按staflow分组,将created_at转成日期类型后倒序排序,标记行号
        ROW_NUMBER() OVER (
            PARTITION BY staflow 
            ORDER BY STR_TO_DATE(created_at, '%d/%m/%Y %H.%i') DESC
        ) AS rn
    FROM your_table_name -- 替换成你的实际表名
    WHERE id_konsul = 4
)
-- 筛选每个分组内行号为1的记录(即最新的那条)
SELECT id, id_konsul, staflow, created_at
FROM ranked_records
WHERE rn = 1
ORDER BY staflow;

关键说明:

  • PARTITION BY staflow:把数据按staflow分成独立的分组
  • STR_TO_DATE(created_at, '%d/%m/%Y %H.%i'):因为你的created_at是字符串格式,必须转成日期类型再排序,否则字符串排序会出现逻辑错误
  • rn = 1:每个分组里行号为1的就是该组内最新的记录

如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),优先用这个方法,逻辑清晰且性能优异。

方法二:子查询关联(兼容旧版本数据库)

如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用子查询先找出每个staflow的最新时间,再关联原表获取完整记录:

SELECT t1.id, t1.id_konsul, t1.staflow, t1.created_at
FROM your_table_name t1
JOIN (
    -- 先计算每个staflow对应的最新created_at
    SELECT 
        staflow,
        MAX(STR_TO_DATE(created_at, '%d/%m/%Y %H.%i')) AS max_created_at
    FROM your_table_name
    WHERE id_konsul = 4
    GROUP BY staflow
) t2 ON t1.staflow = t2.staflow 
    AND STR_TO_DATE(t1.created_at, '%d/%m/%Y %H.%i') = t2.max_created_at
WHERE t1.id_konsul = 4
ORDER BY t1.staflow;

关键说明:

  • 子查询t2负责统计每个staflow的最新时间
  • 原表t1和t2通过staflow和转换后的created_at关联,匹配到对应的最新记录
  • 注意:如果同一个staflow有两条记录的created_at完全相同,这个方法会返回多条;如果需要保留所有相同时间的记录,可以把方法一中的ROW_NUMBER()换成RANK()

两种方法都能得到你期望的结果,根据你的数据库版本选择合适的即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:41:33