2016-01-17 47 views
0

我有一個查詢,它將刪除重複的行assignment_name, effective_start_date, effective_end_date, effective_latest_change。員工的細節有兩個表SQL查詢中的重複行

xx_as_table

Ass_nmber eff_s_date    eff_e_date effective_l_change  special_ceiling   date_Start  employer_name   worker_type 
------------------------------------------------------------------------------------- 
10228  01-jan-1990   31-dec-4172    1      0    01-feb-1989   XYZ Ltd   E 
10228  03-feb-1989   31-dec-1989    2      0    01-feb-1989   XYZ Ltd   E 

xx_wrk_table

ass_number date_Start  employer_name  worker_type 
------------------------------------------------------------ 
10228   01-feb-1989  XYZ Ltd    E 
10228   01-jan-1991  ABC Ltd    P 

現在,我想如下以檢索上述數據的查詢:

Ass_nmber eff_s_date   eff_e_date   eff_l_change  special_ceiling date_Start  employer_name   worker_type 
---------------------------------------------------------------------------------------------  
10228  01-jan-1990   31-dec-4172    1      0    01-feb-1989   XYZ Ltd   E 
10228  03-feb-1989   31-dec-1989    2      0    01-feb-1989   XYZ Ltd   E 

我想從最早的date_start從xx_wrk_table中獲取date_start,並根據最小的date_Start獲取詳細信息。而且沒有重複行應與同一ASSIGNMENT_NAME,effective_start_date,effective_end_date,effective_latest_change

在那裏爲此,我寫了一個查詢:

select 
    ass_number, 
    regexp_substr(ass_number, '[0-9]+') person_number, 
    effective_start_date, 
    effective_end_date, 
    nvl((select min (wrk.date_start) 
from 
    XX_WRK_STG 
where 
    WRK.PERSON_NUMBER = regexp_substr(assignment_number, '[0-9]+')), effective_start_date) D, t.effective_start_date), 
     nvl(wrk.worker_type, 'E'), 
     nvl(wrk.employer_name, 'XYZ'), 
     effective_latest_change 

     from (SELECT xx_as_table.*, 
       COUNT(*) OVER (PARTITION BY assignment_name, 
              effective_start_date, 
              effective_end_date, 
              effective_latest_change) AS c 
     FROM xx_as_table) T 
left outer join 
    XX_WRK_STG wrk 
on regexp_substr(t.assignment_name, '[0-9]+')=wrk.person_number 
where c=1; 

但此查詢不工作,並針對每個ass_number多個數據越來越檢索來自wrk_table。如何修改我的查詢以獲得預期的結果?

+0

您的預期結果與第一張表完全相同。你能詳細說明你想做什麼嗎? –

+0

@GordonLinoff 我試圖獲取從xx_ass_table使得ASSIGNMENT_NAME重複的數據的細節,effective_start_date,effective_end_date,effective_latest_change被移除並且爲DATE_START,worker_type和employer_name最小 DATE_START從xx_wrk_table應該針對該之間的共同的ass_number被擷取兩個表 –

回答

0

我完全不能理解你的表結構,就像你的例子和書面查詢一樣,你已經使用了不同的列名和一些額外的列。 仍然我試圖幫助。要從工作表中查找具有最小日期的行,可以使用Rank function

SELECT x_tab.Ass_nmber, 
     x_tab.eff_s_date, 
     x_tab.eff_e_date, 
     x_tab.effective_l_change, 
     x_tab.special_ceiling, 
     work_tab.date_Start, 
     work_tab.employer_name, 
     work_tab.worker_type 
    FROM (SELECT Ass_nmber, 
       eff_s_date, 
       eff_e_date, 
       effective_l_change, 
       special_ceiling, 
       COUNT(*) OVER (PARTITION BY Ass_nmber, 
              eff_s_date, 
              eff_e_date, 
              effective_l_change) cnt 
      FROM xx_as_table)x_tab, 
     (SELECT ass_number, 
       date_Start, 
       employer_name, 
       worker_type, 
       person_number, 
       RANK() OVER(PARTITION BY ass_number 
           ORDER BY date_Start DESC) rnk 
      FROM xx_wrk_table) work_tab 
    WHERE s_tab.cnt = 1 
    AND work_tab.rnk = 1 
    AND regexp_substr(s_tab.Ass_nmber, '[0-9]+') = work_tab.person_number; 

如果沒有幫助,請爲您提供適當的創建和插入語句。這將有助於他人幫助你。謝謝。