2015-12-10 4 views
0

У меня есть таблица ниже, которая заполнена некоторыми примерами данных. Я хочу создать новый атрибут 2_day_state. 2_day_state просматривает состояние для каждой строки и сравнивает его с аналогичной строкой за предыдущий день. Существует несколько описаний case для того, как вычисляется 2_day_state в зависимости от значений в течение двух следующих дней. Например. Мы определяем значение для 2_day_state (для дня 2) в зависимости от состояния на 1-й и 2-й день.Вычислить значение, основанное на предыдущем дне без использования соединения

Похоже, что это простая задача, когда мы можем выполнить самостоятельное соединение для достижения этого. На практике эта таблица имеет много атрибутов, которые являются частью ключа. Некоторые из них могут иметь значение null. Поскольку мы не можем присоединиться к null = null, должен быть другой способ вычисления 2_day_state. Есть идеи?

  • день Государственный
  • день = 1, Состояние = 7
  • день = 2, Состояние = 1
  • день = 3, Состояние = 4
  • день = 4, Состояние = 0
+1

Вы попробовали аналитическую функцию, MIN (col) OVER (PARTITION BY col1, col2, col3 ORDER BY col4) '? Можете ли вы показать несколько примеров строк плюс ожидаемый результат? – dnoeth

+0

@Rabbit: В Teradata кажется, что невозможно подключиться к a = b (если a и b являются нулевыми). Я думаю, что знаю, как это решить. Я не могу это проверить. Вместо JOIN ON COALESCE (a, 'value') = COALESCE (b, 'значение) –

+0

Никакая СУБД не присоединится к NULL. Вместо 'COALESCE' лучше использовать @ OR'-условие Кролика, что приводит к лучшей производительности ... – dnoeth

ответ

0

Неверно, вы можете присоединиться к нулям: ON table1.ID = table2.ID AND (table1.field1 = table2.field2 OR (table1.field1 IS NULL AND table2.field2 IS NULL)). С другой стороны, вам действительно следует избегать клавиш, где значения могут быть нулевыми.

Смежные вопросы