SQL 比较具有重复 ID 的行和 Return 具有最低序列号的行
SQL Compare Rows With Duplicate IDs and Return One With Lowest Sequence Number
寻求帮助。我已经看到很多关于如何使用 DUPLICATE 的答案,但并不是我所需要的。假设我的查询结果如下所示。
query result
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
我需要为每个事件编号一行,其中编号最小的批准步骤。所以结果应该是这样的。
filtered query result
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
您可以使用 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
如果只有三列,可以轻松使用聚合:
select incident_no, min(open_approval_step),
min(approval_id) keep (dense_rank first order by open_approval_step)
from t
group by incident_no;
寻求帮助。我已经看到很多关于如何使用 DUPLICATE 的答案,但并不是我所需要的。假设我的查询结果如下所示。
query result
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
我需要为每个事件编号一行,其中编号最小的批准步骤。所以结果应该是这样的。
filtered query result
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
您可以使用 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
如果只有三列,可以轻松使用聚合:
select incident_no, min(open_approval_step),
min(approval_id) keep (dense_rank first order by open_approval_step)
from t
group by incident_no;