2016-08-23 22 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行を取得しています。私が上記の文にmaxを置くと、私はHub2ではなくHub3を取得しています。

すべての行を1行にマージする方法を教えてください。ステータスが判明している2つのハブがあっても、表2の最新のステータスを表示したいと考えています。

詳細情報が必要な場合はお知らせください。

+0

Teradataのリリースについて教えてください。 – dnoeth

+0

バージョンは14.10.07.05 – Santhosha

答えて

0

あなたの最善の策は、表2に2回参加することです。最初は、あなたがここでやっているように、LEFT OUTER JOINidhubの両方に使用しています。別名t3を持っているサブクエリがでt1.hub値を参照することにより、相関サブクエリを使用していること

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 

:降順でタイムスタンプでソートされたときにのみ、トップ1レコードを選択table2のの派生バージョンに続いて二回目それは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 

は、彼らが同じPARTITION BYを使用してORDER BYとして単一STATS-段階にすべてのOVERを結合する必要がありEXPLAIN。