在单行Netezza / Postgres中将多行连接到多个列

时间:2016-04-28 17:05:19

标签: sql join netezza

我有一张看起来像这样的表

Date         Name      Value
----------------------------
2015-01-01   A         12
2015-01-01   B         13
2015-01-01   C         10
2015-01-01   D          9
2015-01-01   E         15
2015-01-01   F         11
2015-01-02   A          1
2015-01-02   B          2
2015-01-02   C          3
2015-01-02   D          4
2015-01-02   E          5
2015-01-02   F          6
2015-01-03   A          7
2015-01-03   B          8
2015-01-03   C          9
2015-01-03   D         10
2015-01-03   E         15
2015-01-03   F         16
....

其中包含每天每个名称的值。我需要一个看起来像这样的第二个表

Date         Name    ValueDate    ValueDate+1     ValueDate+2
--------------------------------------------------------------
2015-01-01   A         12            1                7
2015-01-01   B         13            2                8
2015-01-01   C         10            3                9
2015-01-01   D          9            4               10
2015-01-01   E         15            5               15
2015-01-01   F         11            6               16
2015-01-02   A          1            7              ...
2015-01-02   B          2            8              ...
2015-01-02   C          3            9              ...
2015-01-02   D          4           10              ...
2015-01-02   E          5           15              ...
2015-01-02   F          6           16              ...

我尝试创建一个中间表,其中包含所有正确输入的日期

Date         Name    ValueDate      ValueDate+1     ValueDate+2
----------------------------------------------------------------
2015-01-01   A         2015-01-01    2015-01-02      2015-01-03
2015-01-01   B         2015-01-01    2015-01-02      2015-01-03
2015-01-01   C         2015-01-01    2015-01-02      2015-01-03
2015-01-01   D         2015-01-01    2015-01-02      2015-01-03
2015-01-01   E         2015-01-01    2015-01-02      2015-01-03
2015-01-01   F         2015-01-01    2015-01-02      2015-01-03
...

我的想法是在表a上使用某种JOIN来将相应的值映射到日期并使用s.th喜欢

CASE WHEN Date = ValueDate THEN Value ELSE NULL END AS ValueDate+1

我正在努力弄清楚如何在SQL中完成这项工作。我基本上需要窗口上的所有值来表示初始日期序列。为了给出一些背景知识,我希望在常规时间间隔内看到该值在接下来的x天内的行为方式。数据类型是所有Date列的Date,Name的Varchar和Values的数值。 ValueDate + 1和+2表示+1/2天。此外,不能排除名称的数量随时间保持不变。

感谢

3 个答案:

答案 0 :(得分:1)

您只想要lead()

select a.*,
       lead(value) over (partition by name order by date) as value_1,
       lead(value, 2) over (partition by name order by date) as value_2
from a;

答案 1 :(得分:0)

我不清楚你的问题陈述 -

首先,您不要说数据中的“日期”是日期类型,还是只是看起来像日期的字符串。

“Value”是每行数据的主键吗?或者它是用于计算“ValueDate + 1”的实际值?如果是这样,怎么样?

“ValueDate”只是“Date”的值,而“DateDate + 1”是“Date”之后的第二天?还是一个月后?

ValueDate应该是“Date”加上“Value”天的值吗?

您能否重申问题,并包含数据类型?

您能说出方程式或公式的问题,以及您需要显示的输出值的类型吗?

如果可以,我可以向您展示如何在SQL中对其进行格式化。

- 阿达

答案 2 :(得分:0)

我找到了一种获得所需结果的方法,方法是将row_number()子选择限制写入所需的窗口大小。每个日期的每个条目都给出了这样的条件

Date         Name      Value    Row_Num
---------------------------------------
2015-01-01    A         12        0
2015-01-01    A         12        1
2015-01-01    A         12        2
2015-01-01    A         12        3

在下一步中,可以使用

(Date + Row_Num*INTERVAL'1 DAY')::DATE 

然后可以在初始表上连接并旋转。这将允许每个日期的任意名称组合。