2016-08-23 41 views
0

我有以下要求來選擇最新狀態。從多行中選擇單行 - Teradata

表1:

enter image description here

表2:

enter image description here

結果預期:

enter image description here

下面是我們孃家的邏輯d。

SELECT 
     Table1.ID, 
     ,CASE WHEN (Table1.hub=Table2.hub) THEN Table2.Status ELSE NULL END AS Original_Status 
     ,CASE WHEN (Table1.hub<>Table2.hub AND Table2.Status like 'Found%') THEN Table2.hub ELSE NULL END AS Derived_Hub 
     ,CASE WHEN (Table1.hub<>Table2.hub AND Table2.Status like 'Found%') THEN Table2.Status ELSE NULL END AS Derived_Status 
from 
    Table1 
Join Table2 
    ON (Table1.ID=Table2.ID) 

有了這段代碼,我得到了3行。如果我在上面的case語句中使用max,我得到Hub3而不是Hub2。

請問我可以讓我知道如何將所有東西合併爲一行。請注意,即使有2個已發現狀態的集線器,我也想從表2中顯示最新發現的狀態。

讓我知道你是否需要任何進一步的信息。

+0

您的Teradata發佈是什麼? – dnoeth

+0

版本是14.10.07.05 – Santhosha

回答

0

我認爲你最好的選擇是加入表2兩次。第一次,很像你在這裏做的,但在idhub上都使用LEFT OUTER JOIN。然後第二次對錶2的衍生版本,你只有當時間戳降序排序選擇頂部1記錄:

SELECT 
    t1.id, 
    t1.hub as "Original Hub" 
    t2.status as "Original Hub Status", 
    t3.hub as "Found Hub", 
    t3.status as "Found Hub Status" 
FROM 
    Table1 t1 
    LEFT OUTER JOIN Table2 t2 ON 
     t1.id = t2.id AND 
     t1.hub = t2.hub 
    LEFT OUTER JOIN 
     (
      --Select a hub with the same id, that doesn't share the same hub number 
      --Only choose the top record when sorted by timestamp in descending order   
      SELECT TOP 1 id, hub, status 
      FROM table2 
      WHERE t1.hub <> table2.hub 
      ORDER BY TimeStamp Desc 
     ) t3 ON 
     t1.id = t3.id 

有別名t3被引用在t1.hub值使用相關子查詢的子查詢它是WHERE語句。

+0

謝謝,但我不能訪問左外連接內的t1.hub。 – Santhosha

0

在TD14.10中,您可以利用LAST_VALUE訪問「最後」行中的數據。該CASE S是根據您的查詢:

SELECT 
    t2.ID, 
    CASE WHEN t1.Hub = t2.Hub THEN t2.Hub END AS Original_Hub, 
    CASE WHEN t1.Hub = t2.Hub THEN t2.Status END AS Original_Status, 
    -- get the last Hub 
    LAST_VALUE(CASE WHEN t1.Hub <> t2.Hub AND Table2.Status like 'Found%' 
        THEN t2.Hub 
       END) 
    OVER (PARTITION BY t1.ID 
     ORDER BY CASE WHEN t1.Hub = t2.Hub THEN 0 ELSE 1 END, t2.TS 
     ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Derived_Hub, 
    -- get the last Status 
    LAST_VALUE(CASE WHEN t1.Hub <> t2.Hub AND Table2.Status like 'Found%' 
        THEN t2.Status 
       END) 
    OVER (PARTITION BY t1.ID 
     ORDER BY CASE WHEN t1.Hub = t2.Hub THEN 0 ELSE 1 END, t2.TS 
     ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Derived_Status 
FROM 
    Table1 AS t1 
JOIN Table2 AS t2 
    ON (t1.ID=t2.ID) 
QUALIFY 
    ROW_NUMBER() -- return the 1st row only 
    OVER (PARTITION BY t1.ID 
     ORDER BY CASE WHEN t1.Hub = t2.Hub THEN 0 ELSE 1 END, t2.TS) = 1 

EXPLAIN都應該OVER合併成一個單一的STATS-一步,因爲它們使用相同的PARTITION BYORDER BY