NULLIF выдает неправильный вывод в Amazon Redshift?
Этот следующий код должен производить те же значения для столбцов lag
а также lag2
:
CREATE TABLE bug1 (
id INT,
value INT
);
INSERT INTO bug1 VALUES (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3);
SELECT
id,
value,
(LAG(value) OVER (PARTITION BY id ORDER BY value)) lag,
NULLIF((LAG(value) OVER (PARTITION by id ORDER BY value)), 0) lag2
FROM bug1
ORDER BY id, value;
Действительно, запуск его на PostgreSQL 9 дает ожидаемый результат:
id v lag lag2
1 1
1 2 1 1
1 3 2 2
2 1
2 2 1 1
2 3 2 2
Но запуск его в Redshift дает неверные результаты:
id v lag lag2
1 1 2
1 2 1 3
1 3 2
2 1 2
2 2 1 3
2 3 2
Это ожидается? Я спросил на форумах AWS, но не получил ответа.
1 ответ
Это не ожидается; выглядит как ошибка для меня. Если это было задумано, то с помощью LEAD()
вместо этого и инвертируя ORDER BY
пункт, мы ожидаем, что тот же результат, что и в оригинале LAG()
запрос:
SELECT
id,
value,
(LEAD(value) OVER (PARTITION BY id ORDER BY value desc)) lead,
NULLIF((LEAD(value) OVER (PARTITION by id ORDER BY value desc)), 0) lead2
FROM bug1
ORDER BY id, value;
Но вот что мы получаем вместо:
id | value | lead | lead2
----+-------+------+-------
1 | 1 | |
1 | 2 | 1 | 1
1 | 3 | 2 | 2
2 | 1 | |
2 | 2 | 1 | 1
2 | 3 | 2 | 2