демо: дб <> скрипка
Использование оконных функций может помочь вам:
SELECT DISTINCT
id,
max(ingdt) OVER (PARTITION BY id),
first_value(code) OVER (PARTITION BY id ORDER BY code IS NULL, ingdt DESC) AS code,
first_value(gender) OVER (PARTITION BY id ORDER BY gender IS NULL, ingdt DESC) AS gender,
first_value(address) OVER (PARTITION BY id ORDER BY address IS NULL, ingdt DESC) AS address
FROM mytable
ORDER BY id
Объясняя first_value(...) OVER (...)
:
Функция окна может группировать ваши строки в отдельные кадры. Это делается с помощью ключевого слова PARTITION BY
. В этом случае я генерирую кадры для каждого id
.
Теперь я проверяю, является ли значение столбца NULL
. Это дает мне true
или false
. Я сортирую этот результат как любой boolean
столбец с false
первым (что означает NOT NULL
). Если строк NOT NULL
много, берется последняя строка (ingdt DESC
). Этот порядок также выполняется для каждого отдельного кадра.
first_value()
вычисляет первое значение упорядоченного кадра.