Aqui está o esquema de amostra para meu banco de dados:
Priority | Productive | UnProductive | Neutral |
-------------------------------------------------
High | [1, 2] | [] | [4, 5] |
Medium | [3, 4] | [5, 7] | [2] |
Low | [1] | [2, 6] | [] |
NOTA: Esses números são na verdade UUIDs no meu banco de dados e nenhum número será repetido na mesma linha.
Eu quero desaninhar a categoria de productive
, unproductive
e de neutral
tal forma que:
- Nenhum número de 1 a 7 é repetido e
- Se o número já foi capturado por High Priority não será capturado por Medium e o mesmo vale para Low .
Saída esperada:
Productive: [1, 2, 3] # no 4 because it have been captured by neutral High priority
UnProductive: [7, 6] # no 5 and 2 because it have been captured before
Neutral: [4, 5] # no 2 because it is caputed before
Isso pode ser definido como o maior problema de n por grupo disfarçado. Assim
DISTINCT ON
é meu recurso principal após desaninhar e antes de agregar de volta:Para produzir uma linha como na tabela original:
Ou com resultado pivotado:
db<>fique aqui
Leitura adicional:
Você não mencionou desempenho nesta questão. Considere a resposta à sua pergunta anterior para isso:
Eu resolvi isso relacionalmente desaninhando e atribuindo os pesos conforme sugerido por @Akina.
Veja https://dbfiddle.uk/?rdbms=postgres_13&fiddle=8a54e1f8018c49146faba3e446f7b694
Provavelmente pode ser feito de forma mais eficiente.