2016-08-23 2 views
0

Ich habe eine Anforderung unten, um den neuesten Status auszuwählen.Auswählen einer einzelnen Zeile aus mehreren Zeilen - Teradata

Tabelle 1:

enter image description here

Table2:

enter image description here

Erwartete Ergebnisse:

enter image description here

Unten ist die Logik, die wir nee 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) 

Mit diesem Code bekomme ich 3 Zeilen. Wenn ich in den obigen Fallanweisungen Max gebe, bekomme ich Hub3 statt Hub2.

Bitte lassen Sie mich wissen, wie ich alles in eine Zeile zusammenfassen kann. Bitte beachten Sie, dass ich den neuesten gefundenen Status aus Tabelle 2 anzeigen möchte, auch wenn es zwei Hubs mit gefundenem Status gibt.

Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

+0

Was ist dein Teradata-Release? – dnoeth

+0

Version ist 14.10.07.05 – Santhosha

Antwort

0

Ich denke, Ihre beste Wette ist, in Tabelle 2 zweimal beizutreten. Das erste Mal, ähnlich wie Sie hier, aber mit einem LEFT OUTER JOIN sowohl id und hub. Dann wird das zweite Mal auf einer abgeleiteten Version von table2, wo man nur den Top-1 Datensätze wählen, wenn sie durch Zeitstempel in absteigender Reihenfolge sortiert:

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 

Das Unterabfrage, die Alias ​​hat t3 wird durch Bezugnahme auf den t1.hub Wert eine korrelierte Unterabfrage in es ist WHERE-Anweisung.

+0

Danke, aber ich kann nicht auf t1.hub innerhalb der linken äußeren Join zugreifen. – Santhosha

0

In TD14.10 können Sie LAST_VALUE verwenden, um auf Daten aus der "letzten" Zeile zuzugreifen. Die CASE s basieren auf Anfrage:

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 

ERKLÄREN sollten alle OVER in einem einzigen STATS-Schritt kombinieren, da sie die gleiche PARTITION BY und ORDER BY verwenden.

Verwandte Themen