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

求助:如何在SQL Server中筛选每个Job对应的最小Sequence行(GROUP BY MIN方法失效)

解决每个Job取最小Sequence行的问题

我懂你的困扰——你想给每个工单(Job)只保留Sequence最小的那一行,但用GROUP BY搭配MIN函数的方式没达到预期效果对吧?这主要是因为你当前的GROUP BY里包含了太多额外字段,导致分组的粒度太细,没办法真正按Job来聚合取最小SEQ。

先说说你当前SQL的问题

你的GROUP BY子句里包含了dbo.User_Values.Numeric2、dbo.Work_Center.UVText4、dbo.Job.Status等一堆字段,这意味着只有当这些字段完全相同时,才会被分到同一个组里。哪怕是同一个Job,只要这些字段有差异,就会被拆成多个分组,每个分组取自己的MIN(Sequence),这显然不是你要的“每个Job只取最小SEQ”的结果。

推荐两种可行的解决方案

方案一:用窗口函数ROW_NUMBER()(推荐)

这种方法最灵活,也能轻松保留你需要的所有字段,不会受GROUP BY的限制。核心思路是给每个Job下的行按Sequence升序排号,然后只取排号为1的行:

WITH JobOpsRanked AS (
    SELECT 
        jo.Job,
        jo.Sequence AS SEQ,
        jo.Work_Center,
        wc.Department,
        uv.Numeric2,
        wc.UVText4,
        j.Status AS JobStatus,
        jo.Status AS OpStatus,
        uv.Decimal1,
        -- 按Job分组,Sequence从小到大排序,给每行分配一个行号
        ROW_NUMBER() OVER (PARTITION BY jo.Job ORDER BY jo.Sequence ASC) AS RowNum
    FROM dbo.Job_Operation jo
    INNER JOIN dbo.Job j ON jo.Job = j.Job
    INNER JOIN dbo.User_Values uv ON j.User_Values = uv.User_Values
    INNER JOIN dbo.Work_Center wc ON jo.Work_Center = wc.Work_Center
    WHERE wc.UVText4 = 'Machining' -- 把HAVING里的条件移到WHERE更高效
)
SELECT 
    Job,
    SEQ,
    Work_Center,
    Department,
    Numeric2,
    UVText4,
    JobStatus,
    OpStatus,
    Decimal1
FROM JobOpsRanked
WHERE RowNum = 1 -- 只保留每个Job里Sequence最小的那一行
ORDER BY Decimal1 DESC, SEQ;

如果你的数据里存在同一个Job有多个行的Sequence是相同最小值的情况,想要保留所有这些行,可以把ROW_NUMBER()换成RANK()——这样并列最小的行都会被标记为RowNum=1。

方案二:用子查询匹配最小Sequence

这种方法适合习惯用子查询的场景,先找出每个Job的最小Sequence,再匹配回原表获取完整行数据:

SELECT 
    jo.Job,
    jo.Sequence AS SEQ,
    jo.Work_Center,
    wc.Department,
    uv.Numeric2,
    wc.UVText4,
    j.Status AS JobStatus,
    jo.Status AS OpStatus,
    uv.Decimal1
FROM dbo.Job_Operation jo
INNER JOIN dbo.Job j ON jo.Job = j.Job
INNER JOIN dbo.User_Values uv ON j.User_Values = uv.User_Values
INNER JOIN dbo.Work_Center wc ON jo.Work_Center = wc.Work_Center
WHERE 
    wc.UVText4 = 'Machining'
    AND (jo.Job, jo.Sequence) IN (
        -- 先找出每个Job对应的最小Sequence
        SELECT Job, MIN(Sequence)
        FROM dbo.Job_Operation
        GROUP BY Job
    )
ORDER BY uv.Decimal1 DESC, jo.Sequence;

这个方法会返回所有Job和最小Sequence匹配的行,也就是说如果同一个Job有多个行的Sequence是最小值,都会被保留下来。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:02:27