首页 > 解决方案 > SQL 比较具有重复 ID 的行并返回具有最低序列号的行

问题描述

伸出援手。我已经看到很多关于如何使用 DUPLICATE 的答案,但并不完全是我需要的。假设我的查询结果如下所示。

查询结果

  Incident_No   Open_Approval_Step      Approval_ID     
 ------------- -------------------- ------------------- 
            1                    3   Tech               
            1                    4   Cust_Serv          
            2                    1   Incident_Recorder  
            2                    2   Estimation         
            2                    3   Tech               
            3                    4   Cust_Serv          
            3                    5   Mgmt               
            3                    6   Closure            

对于每个事件编号,我需要一个具有最小编号批准步骤的行。所以结果应该是这样的。

过滤后的查询结果

  Incident_No   Open_Approval_Step      Approval_ID     
 ------------- -------------------- ------------------- 
            1                    3   Tech               
            2                    1   Incident_Recorder  
            3                    4   Cust_Serv          

编辑这是我最后想出的

SELECT DISTINCT

MIN(OPEN_APPROVAL_STEP) OVER(PARTITION BY INCIDENT_NO ORDER BY OPEN_APPROVAL_STEP ASC) AS CUR_APP_STEP,

INCIDENT_NO

FROM T

标签: sqloraclegreatest-n-per-group

解决方案


您可以使用row_number()

select *
from (
    select 
        t.*,
        row_number() over(partition by incident_no order by open_approval_step) rn
    from mytable t
) t
where rn = 1

在事件编号和批准步骤中仅添加一个额外的列,另一种选择是聚合和 Oracle 的keep语法:

select 
    incident_no,
    min(open_approval_step) open_approval_step,
    min(approval_id) keep(dense_rank first order by open_approval_step) approval_id
from mytable
group by incident_no    

推荐阅读