Выберите битовую маску в Postgresql - PullRequest
2 голосов
/ 05 января 2012

У меня есть таблица со столбцами «один» и «два»:

a | x  
a | y  
a | z  
b | x  
b | z  
c | y  

Я хочу написать запрос, чтобы дополнить его отсутствующими вложенными значениями

b | null | y  
c | null | x  
c | null | z  

Затем явыберет его с помощью array_agg(two) group by one, так что

a {1 1 1}  
b {1 0 1}  
c {0 1 0}

и в конце концов экспортирует его в файл CSV с запросом COPY

Какой запрос мне нужно написать для первого шага?

1 Ответ

1 голос
/ 05 января 2012

Вы можете использовать CROSS JOIN, чтобы построить все возможные пары элементов, затем LEFT JOIN, чтобы проверить, существует ли каждая пара элементов:

SELECT
    T1.one,
    T2.two,
    CASE WHEN your_table.one IS NULL THEN 0 ELSE 1 END AS is_present
FROM (SELECT DISTINCT one FROM your_table) T1
CROSS JOIN (SELECT DISTINCT two FROM your_table) T2
LEFT JOIN your_table
ON T1.one = your_table.one AND T2.two = your_table.two

Затем вы можете добавить GROUP BY T1.one и ARRAY_AGG(...) на этот запрос.

...