2014-11-14 82 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