2014-11-14 104 views
1

我不清楚關於基於以下聯接方式:Netezza公司 - 加入2個表,其中日期不匹配

我有以下2分的記錄,並尋求建立上市結果集。

enter image description here

我會加入[符號]和???對於每個[Rec_ID]並且在(或)等於[Record_Dt]之前返回[Effective_dt]的有效[Value_int]。有沒有辦法使用JOIN來實現這一點? INNER JOIN會很好,因爲如果在[Record_Dt]之前找不到[Effectivedt],我不需要返回值。任何援助非常感謝。

回答

1

正如您可能已經發現的那樣,TOP和與特定形式的相關子查詢在Netezza中不起作用。

在Netezza中工作的方法是使用LAG加入子查詢。

SELECT a.rec_id, 
    a.symbol, 
    b.value_int 
FROM tableA a 
    LEFT OUTER JOIN 
     (
     SELECT symbol, 
      value_int, 
      eff_dt, 
      lag(eff_dt, 1,'3999-01-01'::DATE) over (partition BY symbol ORDER BY eff_dt DESC) end_eff_dt 
     FROM tableB 
    ) 
     b 
    ON a.symbol  = b.symbol 
    AND a.record_dt >= b.eff_dt 
    AND a.record_dt < b.end_eff_dt 
ORDER BY rec_id; 

REC_ID | SYMBOL | VALUE_INT 
--------+--------+----------- 
     1 | A  |  1094 
     2 | A  | 2523423 
     3 | A  | 643532 
     4 | A  | 643532 
     5 | B  |  34242 
     6 | B  | 534632 
     7 | B  | 8567555 
     8 | B  |  5665 
     9 | B  | 
(9 rows) 

你在做什麼看起來很像引用一個緩慢變化的維度。如果是這樣,則應考慮預先計算下一個/結束生效日期作爲ETL的一部分,並將其存儲在tableB中以獲得更高效的查詢。

+0

簡直太棒了。感謝斯科特 – 2014-12-02 21:42:56

0

我可以用查詢中的子查詢來產生你的期望。我不認爲有一種方法可以只通過連接來完成。

CREATE TABLE #tableA 
    (
    rec_id int, 
    symbol varchar(20), 
    record_dt datetime 
    ); 

CREATE TABLE #tableB 
    (  
    symbol varchar(20), 
    value_int int, 
    eff_dt datetime 
    ); 

INSERT INTO #tableA 
(rec_id, symbol, record_dt) 
VALUES 
(1, 'A', '10-01-2014'), 
(2, 'A', '07-10-2014'), 
(3, 'A', '04-01-2014'), 
(4, 'A', '03-27-2014'), 
(5, 'B', '09-02-2014'), 
(6, 'B', '08-30-2014'), 
(7, 'B', '04-01-2014'), 
(8, 'B', '02-20-2014'), 
(8, 'B', '01-01-2014'); 

INSERT INTO #tableB 
(symbol, value_int, eff_dt) 
VALUES 
('A', 1094, '09-02-2014'), 
('A', 328087, '08-18-2014'), 
('A', 2523423, '05-21-2014'), 
('A', 643532, '03-27-2014'), 
('B', 34242, '09-02-2014'), 
('B', 534632, '08-18-2014'), 
('B', 22342, '05-21-2014'), 
('B', 8567555, '03-27-2014'), 
('B', 5665, '01-10-2014'); 

SELECT a.rec_id 
, a.symbol 
, (SELECT TOP 1 value_int 
from #tableB b 
WHERE a.symbol = b.symbol and a.record_dt >= b.eff_dt 
order by b.eff_dt desc) 
FROM #tableA a 

DROP TABLE #tableA 
DROP TABLE #tableB 
相關問題