我有两张表asg
和work rship
在工作表中,每位员工都有date_start
。对于少数员工,date_start是重复的,所以我必须从工作rship表中选择min(date_start)
为此我写了一个查询:
SELECT assignment_name,
REGEXP_SUBSTR(ASSIGNMENT_NAME, '[0-9]+') PERSON_NUMBER,
NVL( wrk.date_start,t.effective_start_date) ,
NVL( WRK.WORKER_TYPE,'E'),
NVL( WRK.LEGAL_EMPLOYER_NAME, 'N/A')
FROM
(SELECT apps.assignment_table.*,
COUNT(*) OVER (PARTITION BY assignment_name, effective_start_date, effective_end_date, effective_latest_change) AS c
FROM apps.assignment_table
) T
LEFT OUTER JOIN
(SELECT *
FROM apps.work_table
WHERE date_start =
(SELECT MIN(date_start) FROM apps.work_table
)
) wrk
ON regexp_substr(t.assignment_name, '[0-9]+')=wrk.person_number
WHERE C =1;
但是在上面的查询中我犯了一个错误,就是从apps.work_table中选择select min(date_start),这意味着从整个表中选择min(date_start)。
而不是这个,我应该在内联查询本身中包含regexp_substr(t.assignment_name, '[0-9]+')=wrk.person_number
。
但现在当我把它包括在内时......它没有用。
答案 0 :(得分:1)
LEFT OUTER JOIN
(SELECT *
FROM apps.work_table
WHERE date_start =
(SELECT MIN(date_start) FROM apps.work_table
)
) wrk
ON
除非此人的start_date
是整个表格中所有人的最小值(而不仅仅是此人的最短日期),否则上面的代码将找不到与您相匹配的任何行想。
你可能想做的事情是:
LEFT OUTER JOIN
( SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY person_number ORDER BY date_start ASC ) AS rn
FROM apps.work_table t
)
WHERE rn = 1
) wrk
ON