netezza sql,怎么实现?

时间:2016-07-21 07:59:22

标签: netezza

create table p(pid int, st int, v int,hid int,ht varchar(2));
data:
insert into p(pid,st,hid, ht,v )
select 1    ,20160131   ,100    ,'FO'   ,10
union select 1  ,20160131   ,101    ,'FO'   ,20
union select 1  ,20160131   ,102    ,'FO'   ,30
union select 1  ,20160131   ,103    ,'ST'   ,40
union select 1  ,20160229   ,104    ,'ST'   ,50
union select 207    ,20160229   ,301    ,'ST'   ,80
union select 207    ,20160229   ,302    ,'ST'   ,20
union select 207    ,20160331   ,303    ,'FO'   ,40
union select 102    ,20160229   ,205    ,'ST'   ,60
union select 102    ,20160229   ,206    ,'ST'   ,20
union select 102    ,20160229   ,207    ,'FO'   ,20
union select 100    ,20160131   ,201    ,'ST'   ,50
union select 100    ,20160131   ,202    ,'ST'   ,50
union select 101    ,20151231   ,203    ,'ST'   ,50
union select 101    ,20151231   ,204    ,'ST'   ,50


result:
pid v   hid ht  path    pre_st  next_st st
1   40  103 ST  1   NULL    NULL    20160131
100 50  201 ST  1--->100    NULL    NULL    20160131
100 50  202 ST  1--->100    NULL    NULL    20160131
101 50  203 ST  1--->101    20151231    NULL    20160131
101 50  204 ST  1--->101    20151231    NULL    20160131
102 20  206 ST  1--->102    NULL    20160229    20160131
102 60  205 ST  1--->102    NULL    20160229    20160131
207 20  302 ST  1--->102--->207 NULL    20160331    20160229
207 80  301 ST  1--->102--->207 NULL    20160331    20160229
303 99  304 ST  1--->102--->207--->303  NULL    20160720    20160331


I can do it in SQLServer first. 
select pid,v,hid,ht, path=cast(pid as varchar) ,
 (select max(st) from p where pid = a.pid and st < a.st) as pre_st,
 (select max(st) from p where pid = a.pid and st > a.st) as next_st,
 a.st into #t1
 from p a where pid=? and st=?
but netezza cannot support this grammer.

我需要通过pid,st作为参数来完成它。假设我们使用pid = 1和st = 20160131,我将参数集保存在一个表中。 create table i(pid int,st int) 插入i(pid,st) 选择1,20160131 如何实现上述结果?

1 个答案:

答案 0 :(得分:0)

如果您只是想创建一个临时表(相当于您的SQL Server语法),那么就是这样:

create temporary table t1 as
select pid,v,hid,ht, path=cast(pid as varchar) ,
(select max(st) from p where pid = a.pid and st < a.st) as pre_st,
(select max(st) from p where pid = a.pid and st > a.st) as next_st,
a.st 
from p a where pid=? and st=?

我将假设您拥有?值,因为您使用的是ODBC参数。如果你想让Netezza提示你做些什么,you can't