我有一张表new_table
ID PROC_ID STAFF_ID
1 558 4141
2 558 601
3 558 556
-------------------------------
4 602 601
5 602 795
-------------------------------
6 634 601
7 634 195
8 634 295
-------------------------------
9 705 601
10 705 788
-------------------------------
11 716 458
12 716 601
... ... ...
n 1890 4141
当我可以从new_table中选择proc_id,其中staff_id = 601得到结果。例如
proc_id
602
634
705
其中staff_id是第一个order_by id
答案 0 :(得分:1)
一种方法使用窗口函数:
select proc_id
from (select t.*, row_number() over (partition by proc_id order by id) as seqnum
from t
) t
where seqnum = 1 and staff_id = 601;
另一种有趣的方法是使用带有having
子句的聚合:
select proc_id
from t
group by proc_id
having min(id) = min(case when staff_id = 601 then id end);
答案 1 :(得分:1)
这是带有having
子句的标准聚合查询。 having
子句中的条件使用first/last
函数(如果您不熟悉此聚合函数,请使用Google Oracle文档)。
with
inputs ( id, proc_id, staff_id ) as (
select 1, 558, 4141 from dual union all
select 2, 558, 601 from dual union all
select 3, 558, 556 from dual union all
select 4, 602, 601 from dual union all
select 5, 602, 795 from dual union all
select 6, 634, 601 from dual union all
select 7, 634, 195 from dual union all
select 8, 634, 295 from dual union all
select 9, 705, 601 from dual union all
select 10, 705, 788 from dual union all
select 11, 716, 458 from dual union all
select 12, 716, 601 from dual union all
select 99, 1890, 4141 from dual
)
-- End of simulated data (for testing purposes only, not part of the query).
-- Solution begins BELOW THIS LINE.
select proc_id
from inputs
group by proc_id
having min(staff_id) keep (dense_rank first order by id) = 601
;
PROC_ID
-------
602
634
705