2015-11-05 28 views
2

我需要幫助來解決這個特定的SQL問題,我不能寫存儲特效,因爲我需要將此端口移植到Hive。加入後從另一個表第二最低值

有兩個tQCles Contr和Lvl,我需要左連接它們,並使用前一行的值填充來自LVL的連接tQCle中的空值。 我有樣品tQCles在

Contr 
|  id |  EFF_DT | M_NBR | ACTY_SEQ_NBR | L_CD | 
|---------|------------|-------|--------------|------| 
| QQFAE46 | 2000-12-24 | 11 |   1 | POT | 
| QQFAE46 | 2000-12-24 | 11 |   2 | POT | 
| QQFAE46 | 2000-12-24 | 11 |   3 | POT | 
| QCC5433 | 2013-04-21 | 00 |   1 | MIC | 
| QCC5433 | 2013-04-21 | 00 |   2 | MIC | 
| QCC614E | 2015-07-18 | 00 |   1 | MIC | 
| QCC614E | 2015-07-18 | 00 |   4 | MIC | 
| QC56DDF | 1999-10-01 | 14 |   2 | POT | 
| QC56DDF | 1999-10-01 | 14 |   3 | POT | 
| QC56DDF | 1999-10-01 | 14 |   4 | POT | 
| ACB3DC2 | 1999-10-01 | 14 |   1 | POT | 

LVL 
|  id |  EFF_DT | M_NBR | ACTY_SEQ_NBR | OCCR | 
|---------|------------|-------|--------------|------| 
| QQFAE46 | 2000-12-24 | 11 |   1 | 100 | 
| QQFAE46 | 2000-12-24 | 11 |   3 | 100 | 
| QCC5433 | 2013-04-21 | 00 |   2 | 200 | 
| QCC614E | 2015-07-18 | 00 |   3 | 200 | 
| QC56DDF | 1999-10-01 | 14 |   1 | 0 | 

LEFT JOIn of Contr and Lvl 

|  id |  EFF_DT | M_NBR | ACTY_SEQ_NBR | L_CD |  id |  EFF_DT | M_NBR | ACTY_SEQ_NBR | OCCR | 
|---------|------------|-------|--------------|------|---------|------------|--------|--------------|--------| 
| QQFAE46 | 2000-12-24 | 11 |   1 | POT | QQFAE46 | 2000-12-24 |  11 |   1 | 100 | 
| QQFAE46 | 2000-12-24 | 11 |   2 | POT | (null) |  (null) | (null) |  (null) | (null) | 
| QQFAE46 | 2000-12-24 | 11 |   3 | POT | QQFAE46 | 2000-12-24 |  11 |   3 | 100 | 
| QCC5433 | 2013-04-21 | 00 |   1 | MIC | (null) |  (null) | (null) |  (null) | (null) | 
| QCC5433 | 2013-04-21 | 00 |   2 | MIC | QCC5433 | 2013-04-21 |  00 |   2 | 200 | 
| QCC614E | 2015-07-18 | 00 |   1 | MIC | (null) |  (null) | (null) |  (null) | (null) | 
| QCC614E | 2015-07-18 | 00 |   4 | MIC | (null) |  (null) | (null) |  (null) | (null) | 
| QC56DDF | 1999-10-01 | 14 |   2 | POT | (null) |  (null) | (null) |  (null) | (null) | 
| QC56DDF | 1999-10-01 | 14 |   3 | POT | (null) |  (null) | (null) |  (null) | (null) | 
| QC56DDF | 1999-10-01 | 14 |   4 | POT | (null) |  (null) | (null) |  (null) | (null) | 
| ACB3DC2 | 1999-10-01 | 14 |   1 | POT | (null) |  (null) | (null) |  (null) | (null) | 

現在我需要用值來填充來自拉特tQCle空ACTY_SEQ_NBR值。 該標準從CONTR(即,從已加入的tQCle的列4)中找到對應的ACTY_SEQ_NBR,並從相對於相同id,eff_dt和m_nbr的ACTY_SEQ_NBR小於 的值從LVL中找到ACTY_SEQ_NBR大於或等於來自CONTRACTY_SEQ_NBR的值。

for。例如第2行的空值爲ACTY_SEQ_NBR,其對應的ACT_SEQ_NBR爲2,從LVL小於2的ACTY_SEQ_NBR值爲1.

所以我理想的輸出應該與這一行相同。

|  id |  EFF_DT | M_NBR | ACTY_SEQ_NBR | L_CD |  id |  EFF_DT | M_NBR | ACTY_SEQ_NBR | OCCR | 
|---------|------------|-------|--------------|------|---------|------------|--------|--------------|--------| 
| QQFAE46 | 2000-12-24 | 11 |   1 | POT | QQFAE46 | 2000-12-24 |  11 |   1 | 100 | 
| QQFAE46 | 2000-12-24 | 11 |   2 | POT | (null) |  (null) | (null) |   1 | (null) | 

I tried a lag query but its not giving correct output for all values. 

我執行Amniders查詢,我改變了結果得到預期值。 這裏是我的預期值

|  ID |  EFF_DT | M_NBR | ACTY_SEQ_NBR | L_CD | LVL_ID | LVL_EFF_DT | LVL_M_NBR | LVL_ACTY_SEQ_NBR | OCCR | CALC_LVL_ACTY_SEQ_NBR | 
|---------|------------|-------|--------------|------|---------|------------|-----------|------------------|--------|-----------------------| 
| QQFAE46 | 2000-12-24 | 11 |   1 | POT | QQFAE46 | 2000-12-24 |  11 |    1 | 100 |      1 | 
| QQFAE46 | 2000-12-24 | 11 |   2 | POT | (null) |  (null) | (null) |   (null) | (null) |      1 | 
| QQFAE46 | 2000-12-24 | 11 |   3 | POT | QQFAE46 | 2000-12-24 |  11 |    3 | 100 |      3 | 
| QC56DDF | 1999-10-01 | 14 |   2 | POT | (null) |  (null) | (null) |   (null) | (null) |      1 | 
| QC56DDF | 1999-10-01 | 14 |   3 | POT | (null) |  (null) | (null) |   (null) | (null) |      1 | 
| QC56DDF | 1999-10-01 | 14 |   4 | POT | (null) |  (null) | (null) |   (null) | (null) |      1 | 
| QCC5433 | 2013-04-21 | 00 |   1 | MIC | (null) |  (null) | (null) |   (null) | (null) |     -99 | 
| QCC5433 | 2013-04-21 | 00 |   2 | MIC | QCC5433 | 2013-04-21 |  00 |    2 | 200 |      2 | 
| QCC614E | 2015-07-18 | 00 |   1 | MIC | (null) |  (null) | (null) |   (null) | (null) |     -99 | 
| QCC614E | 2015-07-18 | 00 |   4 | MIC | (null) |  (null) | (null) |   (null) | (null) |      3 | 
| ACB3DC2 | 1999-10-01 | 14 |   1 | POT | (null) |  (null) | (null) |   (null) | (null) |     -99 | 

任何幫助表示讚賞

回答

1

感謝更廣泛的例子!這可能適用於單個完整的外連接,但我認爲聚合和過濾會變得混亂。最簡單的辦法是左連接到拉特兩次,第一次找到「以前act_seq_nbr」,然後再爲你一直(但使用合併使用「以前act_seq_nbr」當沒有act_seq_nbr發現):

SELECT c.id,c.eff_dt,c.m_nbr,c.acty_seq_nbr, 
     l.id,l.eff_dt,l.m_nbr, 
     coalesce(l.acty_seq_nbr, prev_acty_seq_nbr, -99) l_acty_seq_nbr 
from 
    (  
    select c.id,c.eff_dt,c.m_nbr,c.acty_seq_nbr, 
      MAX(L.acty_seq_nbr) prev_acty_seq_nbr 
    from contr c 
    left join lvl l 
     on 
      c.id=l.id 
      and c.eff_dt=l.eff_dt 
      and c.m_nbr=l.m_nbr 
      and c.acty_seq_nbr>l.acty_seq_nbr 
    GROUP BY 
     c.id,c.eff_dt,c.m_nbr,c.acty_seq_nbr 
    ) c 
left join lvl l 
    on 
     c.id=l.id 
     and c.eff_dt=l.eff_dt 
     and c.m_nbr=l.m_nbr  
     and c.acty_seq_nbr=l.acty_seq_nbr; 

小提琴: http://www.sqlfiddle.com/#!6/1270f/74/0

結果:

|  id |  eff_dt | m_nbr | acty_seq_nbr |  id |  eff_dt | m_nbr | l_acty_seq_nbr | 
|---------|------------|-------|--------------|---------|------------|--------|----------------| 
| AAFAE46 | 2000-12-24 | 11 |   1 | AAFAE46 | 2000-12-24 |  11 |    1 | 
| AAFAE46 | 2000-12-24 | 11 |   2 | (null) |  (null) | (null) |    1 | 
| AAFAE46 | 2000-12-24 | 11 |   3 | AAFAE46 | 2000-12-24 |  11 |    3 | 
| AB56DDF | 1999-10-01 | 14 |   2 | (null) |  (null) | (null) |    1 | 
| AB56DDF | 1999-10-01 | 14 |   3 | (null) |  (null) | (null) |    1 | 
| AB56DDF | 1999-10-01 | 14 |   4 | (null) |  (null) | (null) |    1 | 
| ABC5433 | 2013-04-21 | 00 |   1 | (null) |  (null) | (null) |   -99 | 
| ABC5433 | 2013-04-21 | 00 |   2 | ABC5433 | 2013-04-21 |  00 |    2 | 
| ABC614E | 2015-07-18 | 00 |   1 | (null) |  (null) | (null) |   -99 | 
| ABC614E | 2015-07-18 | 00 |   4 | (null) |  (null) | (null) |    3 | 
| ACB3DC2 | 1999-10-01 | 14 |   1 | (null) |  (null) | (null) |   -99 |    
+0

感謝您的試用,但查詢無法按預期工作。 MAX不是我需要的,如果LVL表連接的ACTY_SEQ值爲空,請從LVL表中查找小於相應CONTR表的ACTY_SEQ值的ACTY_SEQ值。 – Abhi

+1

我與Amninder--你能提供編輯原始問題的樣本數據,實際演示所有變化(和每個期望的結果)? – KevinKirkpatrick

0

我希望我能理解你的問題。試試這個查詢:

SELECT 
ID, EFF_DT, M_NBR, ACTY_SEQ_NBR, L_CD, LVL_ID, LVL_EFF_DT, LVL_M_NBR, LVL_ACTY_SEQ_NBR, OCCR 
--,LAG(ACTY_SEQ_NMBR) OVER (PARTITION BY ID, EFF_DT, M_NBR ORDER BY ACTY_SEQ_NMBR) 
,COALESCE(CASE WHEN LVL_ACTY_SEQ_NBR IS NULL THEN LAG(ACTY_SEQ_NBR) OVER (PARTITION BY ID, EFF_DT, M_NBR ORDER BY ACTY_SEQ_NBR) ELSE LVL_ACTY_SEQ_NBR END,'NA') CALC_LVL_ACTY_SEQ_NBR FROM(
SELECT A.ID, A.EFF_DT, A.M_NBR, A.ACTY_SEQ_NBR, A.L_CD 
, B.ID LVL_ID, B.EFF_DT LVL_EFF_DT, B.M_NBR LVL_M_NBR, B.ACTY_SEQ_NBR LVL_ACTY_SEQ_NBR , B.OCCR 
FROM EDWT.CONTR A 
LEFT JOIN EDWT.LVL B 
ON A.ID = B.ID AND A.ACTY_SEQ_NBR = B.ACTY_SEQ_NBR and a.eff_dt=b.eff_dt and a.m_nbr=b.m_nbr) A; 
+0

感謝Amninder的嘗試,但沒有得到預期的結果。在行#4 ABC5433 |的情況下查詢失敗2013-04-21 | 00 | 1,其中LVL數據全爲空,我們需要從LVL中找到最低的ACTY_SEQ。 w.r.t的值降低或等於其CONTR值。根據查詢,即使我們有LVL條目,它也會返回'NA'。 AB56DDF | 1999-10-01 | 14 | 1 – Abhi

0

你想如何處理你所提供的兩行以外的例子我不清楚......如果你能在填補空白的數據的其餘部分,這將有所幫助。

在此期間,這裏有一個裂縫它:

with foo as (
    select 
    c.id as cid, c.eff_dt as c_eff_dt, 
    c.m_nbr as c_m_nbr, c.acty_seq_nbr as c_acty_seq_nbr, 
    l.id as lid, l.eff_dt as l_eff_dt, l.m_nbr as l_m_nbr, 
    l.acty_seq_nbr as l_acty_seq_nbr, 
    sum (case when l.id is null then 0 else 1 end) 
     over (partition by c.id order by c.acty_seq_nbr) as idx 
    from 
    contr c 
    left join lvl l on 
     c.id=l.id and 
     c.eff_dt=l.eff_dt and 
     c.m_nbr=l.m_nbr and 
     c.acty_seq_nbr=l.acty_seq_nbr 
) 
select 
    cid, c_eff_dt, c_m_nbr, c_acty_seq_nbr, 
    lid, l_eff_dt, l_m_nbr, l_acty_seq_nbr, 
    min (c_acty_seq_nbr) over (partition by cid, idx) as acty_seq_nbr 
from foo 
+0

謝謝Hambone。我會多解釋一下。在我們對Contr c和LVL l進行LEFT連接後,我們將爲l.id,l.eff_dt,l.m_nbr和l.seq_nbr獲取空值。對於LVL l爲空的所有行,我們需要填充LVL表中的l.acty_seq_nbr值。爲此,條件是找到左連接表的a.id,a.eff_dt,a.m_nbr和a.acty_seq_nbr的值,從LV表中找到一個較低或相等的值,例如(來自LVL nl的SELECT nl.acty_seq_nbr,其中a.id = nl.id和a.eff_dt = nl.eff_dt,a.m_nbr = nl.m_nbr和nl.acty_seq_nbr <= a.acty_seq_nbr)。希望這可以幫助 – Abhi

1

試試這個:

SELECT 
    ID, EFF_DT, M_NBR, ACTY_SEQ_NBR, L_CD, LVL_ID, LVL_EFF_DT, LVL_M_NBR, LVL_ACTY_SEQ_NBR, OCCR 
    ,COALESCE(CASE WHEN LVL_ACTY_SEQ_NBR IS NULL THEN COALESCE(LAG(ACTY_SEQ_NBR) OVER (PARTITION BY ID, EFF_DT, M_NBR ORDER BY ACTY_SEQ_NBR),ACTY_SEQ_NBR) ELSE LVL_ACTY_SEQ_NBR END,'NA') LVL_NMBR 
    FROM(
    SELECT A.ID, A.EFF_DT, A.M_NBR, A.ACTY_SEQ_NBR, A.L_CD 
    , B.ID LVL_ID, B.EFF_DT LVL_EFF_DT, B.M_NBR LVL_M_NBR, B.ACTY_SEQ_NBR LVL_ACTY_SEQ_NBR , B.OCCR 
    FROM EDWT.CONTR A 
    LEFT JOIN EDWT.LVL B 
    ON A.ID = B.ID AND A.ACTY_SEQ_NBR = B.ACTY_SEQ_NBR and a.eff_dt=b.eff_dt and a.m_nbr=b.m_nbr) A; 

另外,請與以下行有效值幫助:

ID EFF_DT M_NBR ACTY_SEQ_NBR L_CD LVL_ID LVL_EFF_DT LVL_M_NBR LVL_ACTY_SEQ_NBR OCCR LVL_NMBR

ABC5433 2013年4月21日00 1 1 IMC

什麼樣的數據是你期待的lvl_acty_seq_nbr爲ABC614E & ABC5433。 ABC614E在lvl表中沒有acty_Seq_nbr,並且在控制中有1 &。請爲上面的id提供您的預期輸出。你想要在同一個ID內的最低值或所有ID的最低值?

相關問題