2016-02-08 55 views
0

取最小日期开始我有两个表asgwork rshipSQL查询来对每个员工

在工作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; 

但在上面的查询我也只是选择选择分钟的错误( date_start)from apps.work_table这意味着min(date_start)来自整个表格。 取而代之,我应该在内联查询本身中包含regexp_substr(t.assignment_name, '[0-9]+')=wrk.person_number

但现在当我包括它..它不工作。

+0

为什么不选择personnumber,分钟(DATE_START)......从TABLE1 JOIN表2? – sagi

+0

将不得不使用group .. ..必须从上面的查询中获取13列...这似乎更好 –

+0

那不是,您正在从工作表中选择两次,并在分配表上使用一次分析函数。 – sagi

回答

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