У меня есть база данных postgres 9.6, содержащая таблицу с лицами и национальностями, которая выглядит следующим образом:
person_id nationality
----------- -------------
1 American
2 British
3 Canadian
3 Dutch
3 Ethiopian
3 French
3 German
Я создаю таблицу для целей анализа, которая содержит по одной строке на человека.Я хочу добавить четыре столбца для первых четырех национальностей на человека.Это мой ожидаемый результат:
person_id nat_a nat_b nat_c nat_d
----------- ---------- ------- ----------- --------
1 American
2 British
3 Canadian Dutch Ethiopian French
Пятого гражданства человека 3 (немца) не видно из-за того, что он пятый.Национальности от B до D лиц 1 и 2: NULL
s.
В настоящее время я создаю эту таблицу следующим образом:
SELECT DISTINCT
person_id,
nth_value(nationality, 1) OVER w AS nat_a,
nth_value(nationality, 2) OVER w AS nat_b,
nth_value(nationality, 3) OVER w AS nat_c,
nth_value(nationality, 4) OVER w AS nat_d
FROM nationalities
WINDOW w AS (PARTITION BY person_id ORDER BY nationality ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
Этот запрос дает ожидаемый результат.Однако я не совсем доволен его подходом.Поскольку nth_value
является оконной функцией, мне нужно указать окно, а затем применить операцию DISTINCT
.Я бы предпочел использовать GROUP BY
или что-то подобное.
Есть ли более эффективный способ сделать это?