Сначала попробуйте сами: на собеседовании подсказки не будет.
Разворот «ключ-значение» в колонки это группировка по id с условными агрегатами: max(value) FILTER (WHERE key = 'fio') берёт значение нужного ключа, для остальных строк группы фильтр отбрасывает всё, и остаётся одно значение.
У id = 3 нет города, поэтому city получится NULL без дополнительных усилий. В СУБД без FILTER пишут max(CASE WHEN key = 'fio' THEN value END).
SELECT id, max(value) FILTER (WHERE key = 'fio') AS fio, max(value) FILTER (WHERE key = 'city') AS city FROM source_data GROUP BY id