Я пытаюсь перенести некоторые плохо сформированные данные в базу данных. Данные поступают из CSV и сначала загружаются в промежуточную таблицу всех столбцов varchar (поскольку на этом этапе я не могу обеспечить безопасность типов).Саморегулярный оператор CASE WHEN в SQL
Эти данные могут выглядеть
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 данные релевантны. Я хотел бы начать преобразовывать данные, создав столбец «Бренд», где «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
Значение StoreBrand, когда Col2 и Col3 равны нулю, является несущественным - эта строка будет удалена как часть процесса преобразования. Важно связать строки данных (т. Е. С датами) с их брендом.
Есть ли способ ссылаться на предыдущее значение для столбца, который мне не хватает?
Как должен выглядеть результат? –
И вы импортировали данные с каким-то столбцом номера строки (например, 'serial'), который сохраняет исходный порядок. –
vkp - см. Править. –