У меня есть таблица в базе данных Postgres с ежемесячными колоннами с 2012 до конца 2018 года:Массы-Коалесцентные неопределенных значения
create table sales_data (
part_number text not null,
customer text not null,
qty_2012_01 numeric,
qty_2012_02 numeric,
qty_2012_03 numeric,
...
qty_2018_10 numeric,
qty_2018_11 numeric,
qty_2018_12 numeric,
constraint sales_data_pk primary key (part_number, customer)
);
Данных заполняются из большой функции, которая извлекает данные из чрезвычайно широких различных источников. Он включает в себя много левых объединений - например, в сочетании истории с будущими данными, где один элемент может иметь историю, но не будущий спрос или наоборот. Или некоторые клиенты могут не иметь данных так далеко или вперед, как мы хотим.
Проблема, с которой я сталкиваюсь, связана с левыми объединениями (и характером данных, которые я вытягиваю), значительное количество значений, которые я вытягиваю, равно null. Я хотел бы, чтобы любой нуль просто был равен нулю, чтобы упростить любые запросы к этой таблице, а именно агрегировать функции, которые говорят 1 + null + 2 = null.
I может изменить функцию и добавить сотни заявлений о слиянии. Тем не менее, я надеялся, что есть еще один способ обойти это, даже если это означает изменение значений после факта. Тем не менее, это означало бы добавить 84 заявления об обновлении в конце функции:
update sales_data set qty_2012_01 = 0 where qty_2012_01 is null;
update sales_data set qty_2012_02 = 0 where qty_2012_02 is null;
update sales_data set qty_2012_03 = 0 where qty_2012_03 is null;
... 78 more like this...
update sales_data set qty_2018_10 = 0 where qty_2018_10 is null;
update sales_data set qty_2018_11 = 0 where qty_2018_11 is null;
update sales_data set qty_2018_12 = 0 where qty_2018_12 is null;
Мне что-то не хватает, правда? Есть ли более простой способ?
Я надеялся, что установка default
в столбце заставит нуль, но она не работает, когда функция явно сообщает ей вставить нуль. Точно так же, если я делаю столбец не-nullable, он просто pukes на моей вставке - я надеялся, что это может заставить вызвать значение по умолчанию.
Кстати, стратегия insert-then-update - это то, о чем я наказываю других, поэтому я понимаю, что это меньше, чем идеально. Эта функция немного зверя, и она требует некоторого периодического обслуживания (длинный рассказ). Моя основная цель - сохранить функцию как читаемую и поддерживаемую, насколько это возможно - НЕ сделать функцию uber-эффективной. Сама таблица не огромна - менее миллиона записей после того, как все сказано и сделано, и мы запускаем функцию для ее заполнения один или два раза в месяц.
"* с месячными столбцов, начиная 2012 до конца 2018 года: *" - почему? Если вы правильно нормализуете свою модель данных, то это всего лишь одна инструкция 'update'. –
@a_horse_with_no_name - честный вопрос. Данные фактически отображаются в Excel в виде диаграммы. Если бы мы сделали это как нормализованные данные, это были бы миллионы строк, которые затем должны были бы суммироваться в сводной таблице/диаграмме. Денормализация была разработана, для быстрой работы в инструменте отображения. У нас есть данные в другом месте, нормированные. Функция принимает эти различные источники данных и заполняет эту таблицу. – Hambone