我将尝试将一些格式不规范的数据迁移到数据库中。这些数据来自CSV文件,并首先加载到一个包含所有varchar列的暂存表中(因为此时我无法强制执行类型安全性)。
这些数据可能看起来像:
第一列是伪标题的公司名称和相关的第二、三列数据的日期混合在一起。我想通过创建一个‘品牌’列来开始转换数据,其中‘StoreBrand’是如果Col2为NULL则为Col1的值,否则为上一行的StoreBrand。类似于:
我写了这个:
这些数据可能看起来像:
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
第一列是伪标题的公司名称和相关的第二、三列数据的日期混合在一起。我想通过创建一个‘品牌’列来开始转换数据,其中‘StoreBrand’是如果Col2为NULL则为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
我写了这个:
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
)以保留原始顺序的数据? - Gordon Linoff