Digamos que eu tenha a seguinte tabela em meu banco de dados postgresql:
id|user_id|document_id|
--|-------|-----------|
1|10 | 100|
2|20 | 100|
3|10 | 200|
4|20 | 200|
5|10 | 300|
6|20 | 300|
7|10 | 400|
8|20 | 400|
Agora eu uno esta tabela a ela mesma na coluna document_id da seguinte maneira:
select t1.document_id, t1.user_id as user_id1, t2.user_id as user_id2
from test_table t1 left join test_table t2 on (t1.document_id = t2.document_id and t1.user_id <> t2.user_id);
O resultado:
document_id|user_id1|user_id2|
-----------|--------|--------|
100|10 |20 |
100|20 |10 |
200|10 |20 |
200|20 |10 |
300|10 |20 |
300|20 |10 |
400|10 |20 |
400|20 |10 |
Aqui, desejo remover linhas semelhantes, como a que está abaixo, porque os dois registros significam a mesma coisa:
document_id|user_id1|user_id2|
-----------|--------|--------|
100|10 |20 |
100|20 |10 |
Portanto, o resultado esperado deve ser semelhante a:
document_id|user_id1|user_id2|
-----------|--------|--------|
100|10 |20 |
200|10 |20 |
300|10 |20 |
400|10 |20 |
Portanto, basicamente, exijo que o document_id apareça uma vez, em vez de duas. Existe alguma maneira de fazer isso?
Editar:
Tentei a seguinte consulta, conforme sugerido por @jarlh:
select t1.document_id, t1.user_id as user_id1, t2.user_id as user_id2
from test_table t1 left join test_table t2 on (t1.document_id = t2.document_id and t1.user_id < t2.user_id);
Mas o resultado é que user_id2 é nulo quando user_id1 é maior dos dois:
document_id|user_id1|user_id2|
-----------|--------|--------|
100|10 |20 |
100|20 | |
200|10 |20 |
200|20 | |
300|10 |20 |
300|20 | |
O comentário de @jarlh pode ser uma maneira de ir aqui, mas outra maneira seria selecionar distinto usando menor / maior:
select distinct
t1.document_id,
least(t1.user_id, t2.user_id) as user_id1,
greatest(t1.user_id, t2.user_id) as user_id2
from test_table t1
left join test_table t2
on t1.document_id = t2.document_id and
t1.user_id <> t2.user_id;
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras