2017-10-04 68 views
1

我的預測表專賣店:POSTGRES將周列轉換爲行嗎?當前周,然後預測量的26周了

CREATE TABLE forecast_listings (
    product integer NOT NULL 
, current_week_date date 
, weekplus0 integer NOT NULL DEFAULT 0 
, weekplus1 integer NOT NULL DEFAULT 0 
, weekplus2 integer NOT NULL DEFAULT 0 
, weekplus3 integer NOT NULL DEFAULT 0 
, weekplus4 integer NOT NULL DEFAULT 0 
-- etc 
, weekplus24 integer NOT NULL DEFAULT 0 
, weekplus25 integer NOT NULL DEFAULT 0 
); 

例如預測一個單一的項目,我選擇單行最近current_week_date然後再看相對周。

SELECT 
unnest(
    array[ 
    to_char(week_current_date, 'YYYY-MM-DD'), 
    to_char(week_current_date + interval '1 weeks', 'YYYY-MM-DD'), 
    to_char(week_current_date + interval '2 weeks', 'YYYY-MM-DD'), 
    to_char(week_current_date + interval '3 weeks', 'YYYY-MM-DD'), 
    to_char(week_current_date + interval '4 weeks', 'YYYY-MM-DD') 
    -- ...all the way to 25 
    ] 
) AS "Week", 
unnest(
    array[ 
    weekplus0, 
    weekplus1, 
    weekplus2, 
    weekplus3, 
    weekplus4 
    -- ...all the way to 25 
    ] 
) AS "Count" 
FROM (
    SELECT * FROM forecast_listings 
    WHERE product_id = 1 
    ORDER BY week_current_date DESC 
    LIMIT 1 
) as row 

我想與Postgres的要做到這一點,基本上是獲取一行,並調換每個星期數一排日期列和計算列:

week, count 
2017-10-01,100 
2017-10-08,200 
2017-10-15,150 
etc. 
+0

請澄清。 'asin','valid_as_of'(你的意思是'current_week_date'?)和'weekcurrent'('weekplus0'?)不在你的表格定義中。標題中的*「month」*是什麼?我伸出援手,用一個我們可以使用的「CREATE TABLE」語句替換列表。和一些語法修復。提供一些示例值和您的Postgres版本。我很確定有一個優雅的解決方案... –

+0

@ErwinBrandstetter是的我已經將問題簡化成簡單的方法,將每週數據從列值轉換爲分隔行的更好方法是什麼。 –

+0

那麼你有你的答案? –

回答

0
SELECT to_char(f.week_current_date + interval '1 week' * w, 'YYYY-MM-DD') 
    , arr[w+1] 
FROM (
    SELECT week_current_date 
     , ARRAY[weekplus0, weekplus1, weekplus2, weekplus3] AS arr -- add all 26 
    FROM forecast_listings 
    WHERE product_id = 1 
    ORDER BY week_current_date DESC NULLS LAST -- ? 
    LIMIT 1 
    ) f 
CROSS JOIN LATERAL generate_series(0, 25) w; 

主要特點是CROSS JOIN LATERALgenerate_series()以生成期望的行。使用ARRAY constructor就像您在子查詢中已有的一樣。生成的索引w用於爲基準日添加幾周以及訪問相應的數組項。注意一個潛伏的off-by-1錯誤,因爲默認情況下Postgres數組索引是基於1的。相關閱讀:

由於week_current_date似乎並允許空值,您可能需要使用ORDER BY week_current_date DESCNULLS LAST用NULL排序行,否則排在最前面。請參閱: