Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Netezza-连接两个日期不匹配的表_Sql_Netezza - Fatal编程技术网

Sql Netezza-连接两个日期不匹配的表

Sql Netezza-连接两个日期不匹配的表,sql,netezza,Sql,Netezza,我不清楚基于以下原因的连接方法: 我有以下两个记录集,希望创建列出的结果集 我会加入[Symbol]和???对于每个[Rec_ID],返回[Record_dt]之前或等于[Record_dt]的[Effective_dt]的活动[Value_int]。有没有一种方法可以使用连接来实现这一点?如果在[Record_Dt]前面没有找到[Effectivedt],则内部联接就可以了,因为我不需要返回值。非常感谢您的帮助。我可以通过查询中的子查询生成您的期望。我认为没有一种方法可以只使用连接来实现这一点

我不清楚基于以下原因的连接方法:

我有以下两个记录集,希望创建列出的结果集


我会加入[Symbol]和???对于每个[Rec_ID],返回[Record_dt]之前或等于[Record_dt]的[Effective_dt]的活动[Value_int]。有没有一种方法可以使用连接来实现这一点?如果在[Record_Dt]前面没有找到[Effectivedt],则内部联接就可以了,因为我不需要返回值。非常感谢您的帮助。

我可以通过查询中的子查询生成您的期望。我认为没有一种方法可以只使用连接来实现这一点

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

正如您可能已经发现的,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的一部分,并将其存储在Table中以进行更有效的查询。谢谢斯科特