JOIN 多行到单行中的多列 Netezza/Postgres
JOIN multiple rows to multiple columns in single row Netezza/Postgres
我有一个 table A 看起来像这样
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
....
其中包含每天每个名称的值。我需要第二个 table,看起来像这样
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 ...
我尝试创建一个中间件 table,其中已正确输入所有日期
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
...
然后我的想法是在 table a 上使用某种 JOIN 将相应的值映射到日期并使用 s.th like
CASE WHEN Date = ValueDate THEN Value ELSE NULL END AS ValueDate+1
我正在努力弄清楚如何在 SQL 中完成此操作。对于初始日期序列,我基本上需要 window 上的所有值。为了提供一些背景知识,我想在固定的时间间隔内查看该值在接下来的 x 天内的行为方式。所有日期列的数据类型均为日期,名称为 Varchar,值为数字。 ValueDate+1 和 +2 表示 +1/2 天。也不能排除名字的数量随着时间的推移保持不变。
谢谢
你只要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;
我不清楚你的问题陈述 --
首先,你没有说数据中的 "Date" 是 Date 类型,还是只是一个看起来像日期的字符串。
"Value"是每行数据的主键吗?或者它是用于计算 "ValueDate+1" 的实际值?如果是这样,如何?
"ValueDate" 只是 "Date" 的值,而 "Date" 后一天的 "ValueDate+1" 是吗?还是后一个月?
ValueDate 应该是 "Date" 加上 "Value" 天的值吗?
你能重述这个问题,并包括你的数据类型吗?
您能否用方程式或公式说明问题,以及您需要显示的输出值类型?
如果可以,我可以在 SQL 中向您展示如何格式化它。
-- 艾达
我找到了一种获得所需结果的方法,方法是将 row_number() sub select 限制写入所需的 window 大小。它给出了每个日期 s.th 的每个条目,就像这样
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
然后可以在初始 table 上加入并旋转。这将允许每个日期名称的任意组合。
我有一个 table A 看起来像这样
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
....
其中包含每天每个名称的值。我需要第二个 table,看起来像这样
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 ...
我尝试创建一个中间件 table,其中已正确输入所有日期
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
...
然后我的想法是在 table a 上使用某种 JOIN 将相应的值映射到日期并使用 s.th like
CASE WHEN Date = ValueDate THEN Value ELSE NULL END AS ValueDate+1
我正在努力弄清楚如何在 SQL 中完成此操作。对于初始日期序列,我基本上需要 window 上的所有值。为了提供一些背景知识,我想在固定的时间间隔内查看该值在接下来的 x 天内的行为方式。所有日期列的数据类型均为日期,名称为 Varchar,值为数字。 ValueDate+1 和 +2 表示 +1/2 天。也不能排除名字的数量随着时间的推移保持不变。
谢谢
你只要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;
我不清楚你的问题陈述 --
首先,你没有说数据中的 "Date" 是 Date 类型,还是只是一个看起来像日期的字符串。
"Value"是每行数据的主键吗?或者它是用于计算 "ValueDate+1" 的实际值?如果是这样,如何?
"ValueDate" 只是 "Date" 的值,而 "Date" 后一天的 "ValueDate+1" 是吗?还是后一个月?
ValueDate 应该是 "Date" 加上 "Value" 天的值吗?
你能重述这个问题,并包括你的数据类型吗?
您能否用方程式或公式说明问题,以及您需要显示的输出值类型?
如果可以,我可以在 SQL 中向您展示如何格式化它。
-- 艾达
我找到了一种获得所需结果的方法,方法是将 row_number() sub select 限制写入所需的 window 大小。它给出了每个日期 s.th 的每个条目,就像这样
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
然后可以在初始 table 上加入并旋转。这将允许每个日期名称的任意组合。