2016-08-23 2 views
0

아래에서 최신 상태를 선택해야합니다.여러 행에서 단일 행 선택 - Teradata

표 1 :

enter image description here

표 2 :

enter image description here

결과 예상 : 아래

enter image description here

우리가 태어나 셨 논리입니다 디.

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를 입력하면 Hub2 대신 Hub3이 표시됩니다.

모든 것을 단일 행으로 병합 할 수있는 방법을 알려주십시오. 상태가 발견 된 허브가 2 개있는 경우에도 표 2의 최신 상태를 표시하고 싶습니다.

추가 정보가 필요하면 알려주세요.

+0

Teradata 릴리스 란 무엇입니까? – dnoeth

+0

버전은 14.10.07.05입니다. – Santhosha

답변

0

최선의 방법은 표 2에 두 번 가입하는 것입니다. 첫 번째로 여기에서 일하는 것과 비슷하지만 LEFT OUTER JOINidhub입니다. 그런 다음 내림차순으로 타임 스탬프으로 분류 할 때 당신은 단지 상위 1 레코드를 선택 표 2의 파생 버전의 두 번째 시간 :

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 

별칭 t3t1.hub 값을 참조하여 상관 하위 쿼리를 사용하고있다 그 하위 쿼리 그것은 WHERE 문입니다.

+0

고마워요.하지만 왼쪽 외부 조인에서는 t1.hub에 액세스 할 수 없습니다. – Santhosha

0

TD14.10에서는 LAST_VALUE을 사용하여 "마지막"행의 데이터에 액세스 할 수 있습니다. CASE들 쿼리를 기반으로 :

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 BYORDER BY를 사용할 때 하나의 통계 단계에 모든 OVER을 결합해야 설명한다.