不適切な形式のデータをデータベースに移行しようとしています。データはCSVから取得され、最初にすべてのvarcharカラムのステージングテーブルにロードされます(この段階でタイプの安全性を強制することはできません)。SQLの自己参照CASE WHEN句
データは、最初のcolumは、会社の擬似ヘッダなどの名前、およびcolum 2と3のデータが関連しているため、日付の混合物である
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
のように見えるかもしれません。私は 'Brand'列を作成してデータを変換したいと思います。StoreBrandはCol2がNULLの場合はCol1の値、そうでない場合は前の行の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を、ほとんどの多様な答えが好ましいので、我々は代替案を検討している)(StoreBrand LAGにチョーク)これは私が作成している派生列だからです。 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
私の目標は、次のブランド名の前にすべての日付値のCOL1の最初の値であるStoreBrand列のようになります。
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がnullの場合のStoreBrandの値は重要ではありません。その行は変換プロセスの一環として削除されます。重要なことは、データ行(つまり日付を含む)をブランドに関連付けることです。
私が欠けている列の前の値を参照する方法はありますか?
結果はどのように見えるのですか? –
そして元の順序を保持する何らかの行番号列(例えば、 'serial')でデータをインポートしましたか? –
vkp - 編集を参照してください。 –