我試圖將一些結構不良的數據遷移到數據庫中。數據來自CSV,並首先被加載到所有varchar列的登臺表中(因爲我無法在此階段強制執行類型安全)。SQL中的自引用CASE WHEN子句
的數據可能看起來像
COL1 | COL2 | COL3
Name 1 | |
2/11/16 | $350 | $230
2/12/16 | $420 | $387
2/13/16 | $435 | $727
Name 2 | |
2/11/16 | $121 | $144
2/12/16 | $243 | $658
2/13/16 | $453 | $214
第一科拉姆是公司名稱爲僞報頭日期的混合物,爲此科拉姆2和3的數據是相關的。我想通過創建一個'Brand'列來開始轉換數據 - 其中'StoreBrand'是Col1(如果Col2爲NULL)的值,否則爲前一行的StoreBrand。 Comething像:
COL1 | COL2 | COL3 | StoreBrand
Name 1 | | | Name 1
2/11/16 | $350 | $230 | Name 1
2/12/16 | $420 | $387 | Name 1
2/13/16 | $435 | $727 | Name 1
Name 2 | | | Name 2
2/11/16 | $121 | $144 | Name 2
2/12/16 | $243 | $658 | Name 2
2/13/16 | $453 | $214 | Name 2
我寫了這個:
SELECT
t.*,
CASE
WHEN t.COL2 IS NULL THEN COL1
ELSE LAG(StoreBrand) OVER()
END AS StoreBrand
FROM
(
SELECT
ROW_NUMBER() OVER() AS i,
*
FROM
Staging_Data
) t;
但數據庫(在這種情況下Postgres的,但我們正在考慮替代方案,從而最多樣化的答案是首選)扼流圈LAG(挪威Storebrand )因爲這是我創建的派生列。調用LAG(Col1中)僅填充第一行真實的數據:
COL1 | COL2 | COL3 | StoreBrand
Name 1 | | | Name 1
2/11/16 | $350 | $230 | Name 1
2/12/16 | $420 | $387 | 2/11/16
2/13/16 | $435 | $727 | 2/12/16
Name 2 | | | Name 2
2/11/16 | $121 | $144 | Name 2
2/12/16 | $243 | $658 | 2/11/16
2/13/16 | $453 | $214 | 2/12/16
我的目標將是挪威Storebrand列是COL1的所有日期值的第一個值下一個品牌名稱前:
COL1 | COL2 | COL3 | StoreBrand
Name 1 | | | Name 1
2/11/16 | $350 | $230 | Name 1
2/12/16 | $420 | $387 | Name 1
2/13/16 | $435 | $727 | Name 1
Name 2 | | | Name 2
2/11/16 | $121 | $144 | Name 2
2/12/16 | $243 | $658 | Name 2
2/13/16 | $453 | $214 | Name 2
當Col2和Col3爲空時,StoreBrand的值無關緊要 - 該行將作爲轉換過程的一部分被刪除。重要的是將數據行(即具有日期的數據行)與其品牌相關聯。
有沒有辦法引用我錯過的列的前一個值?
結果應該如何? –
你是否用某種行號列(例如'serial')導入數據,保留了原來的順序。 –
vkp - 請參閱編輯。 –