2016-01-13 38 views
1

您好,我在Teradata中有以下查詢。我有一個行號分區,並且我想要rn = 1的行。 Teradata不允許我在同一查詢中使用行號作爲過濾器。我知道我可以把下面的代碼放入一個where rn=1的子查詢中,它給了我所需要的東西。但下面的代碼片段需要進入更大的查詢,如果可能,我想簡化它。用分區寫這個SQL查詢的不同方法

是否有不同的方式做到這一點,所以我得到一個2列的表 - 每個客戶一行,相應的fc_id爲最新的eff_to_dt?

select cust_grp_id, fc_id, row_number() over (partition by cust_grp_id order by eff_to_dt desc) as rn 
from table1 

回答

3

您是否考慮過在查詢中使用QUALIFY子句?

SELECT cust_grp_id 
    , fc_id 
    FROM table1 
QUALIFY ROW_NUMBER() 
       OVER (PARTITION BY cust_grp_id 
        ORDER BY eff_to_dt desc) 
     = 1; 
1

計算MAXeff_to_dt每個cust_grp_id然後再加入結果主表。

SELECT T1.cust_grp_id, 
     T1.fc_id, 
     T1.eff_to_dt 
FROM Table1 AS T1 
JOIN 
    (SELECT cust_grp_id, 
      MAX(eff_to_dt) AS max_eff_to_dt 
    FROM Table 
    GROUP BY cust_grp_id) AS T2 ON T2.cust_grp_id = T1.cust_grp_id 
            AND T2.max_eff_to_dt = T1.eff_to_dt 
1

你可以用一對JOIN s到完成同樣的事情:

INNER JOIN My_Table T1 ON <some criteria> 
LEFT OUTER JOIN My_Table T2 ON <some criteria> AND T2.eff_to_date > T1.eff_to_date 
WHERE 
    T2.my_id IS NULL 

你需要理清你的較大查詢的具體標準,但這是有效JOIN荷蘭國際集團所有(T1),但不包括後面一行存在的地方。在WHERE子句中,通過在NOT NULL(在這種情況下,我只假定某個ID值)的列中檢查NULL值來消除這些問題。如果T2上的LEFT OUTER JOIN未能找到匹配項 - 即沒有晚於您想要存在的行的行,則會發生的唯一方法。

此外,JOIN到T1是否是LEFT OUTERINNER達到您的具體要求。