SQL - дважды перебирает строки и меняет значения задним числом

Старый вопрос, но следующее может предложить более подробную информацию.

null не представляет значения или неизвестного значения. Он не указывает , почему нет значения, что может привести к некоторой двусмысленности.

Предположим, что вы запускаете такой запрос:

SELECT *
FROM orders
WHERE delivered=ordered;

т. е. вы ищете строки, где даты ordered и delivered совпадают.

Что следует ожидать, если один или оба столбца равны нулю?

хотя бы одна из дат неизвестна, вы не можете ожидать, что две даты совпадают. Это также случай, когда обе даты неизвестны: как они могут быть одинаковыми, если мы даже не знаем, что они представляют?

По этой причине любое выражение, обрабатывающее null, поскольку значение должно терпеть неудачу. В этом случае он не будет соответствовать. Это также происходит, если вы попробуете следующее:

SELECT *
FROM orders
WHERE delivered<>ordered;

Опять же, как мы можем сказать, что два значения not одинаковы, если мы не знаем, что они .

SQL имеет специальный тест для отсутствующих значений:

IS NULL

В частности, это не сравнение значений , а скорее ищет .

Наконец, что касается оператора !=, насколько мне известно, на самом деле он ни в одном из стандартов не поддерживается, но он очень широко поддерживается. Он был добавлен, чтобы заставить программистов с некоторых языков чувствовать себя как дома. Честно говоря, если программист с трудом запоминает, на каком языке они используют, они начинают плохо.

0
задан Gordon Linoff 4 March 2019 в 15:09
поделиться

1 ответ

Вы можете использовать оконные функции для этого. Похоже, вам нужен последний статус, который вы можете получить, используя first_value() и сортировку по убыванию:

select t.*,
       first_value(eval_group) over (partition by id order by date desc) as new_eval_group
from t;

Если вы хотите только «закончен» и «отменен», вы можете использовать filter: [ 115]

select t.*,
       first_value(eval_group) filter (where eval_group in ('finished', 'canceled') over (partition by id order by date desc) as new_eval_group
from t;
0
ответ дан Gordon Linoff 4 March 2019 в 15:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: