簡體   English   中英

在單行 Netezza/Postgres 中加入多行到多列

[英]JOIN multiple rows to multiple columns in single row Netezza/Postgres

我有一個看起來像這樣的表 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
....

其中包含每天每個名稱的值。 我需要一個看起來像這樣的第二張桌子

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 天中的行為。 數據類型是所有日期列的日期,名稱的 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;

我不清楚你的問題陳述——

首先,您不會說數據中的“日期”是日期類型,還是只是一個看起來像日期的字符串。

“值”是每行數據的主鍵嗎? 或者它是用於計算“ValueDate+1”的實際值? 如果是這樣,如何?

“ValueDate”是否只是“Date”的值,而“ValueDate+1”是“Date”之后的第二天? 還是后一個月?

ValueDate 是否應該是“Date”加上“Value”天的值?

你能重述這個問題,並包括你的數據類型嗎?

你能用方程或公式說明問題,以及你需要顯示的輸出值的類型嗎?

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

——艾達

我找到了一種獲得所需結果的方法,方法是將 row_number() 子選擇限制寫入所需的窗口大小。 這給每個日期的每個條目 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 

然后可以在初始表上加入並旋轉。 這將允許每個日期的名稱的任意組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM