通过分组匹配col1,col2和col2,col1的方式同时按两列分组

时间:2018-08-21 22:27:49

标签: sql postgresql select group-by

我有表“ chat”,其中包含sender_id,receiver_id和message列:

sender_id | recipient_id | message
-------------------------------------
     1    |      2       | Test 1
     2    |      1       | test test
     1    |      3       | more tests
     1    |      2       | aaaa

我想将结果按(sender_id,receiver_id)和相反的结果分组(recipient_id,sender_id)。结果应如下所示:

sender_id | recipient_id
------------------------
     1    |      2
     1    |      3

这是因为发件人也可以在另一行中成为收件人,并且我不希望获得

之类的结果
sender_id | recipient_id
------------------------
     1    |      2
     2    |      1

这是可以正常运行,但几乎没有缺陷的SQL:

SELECT DISTINCT ON sender_id+recipient_id, sender_id, recipient_id 
FROM chat 
WHERE (sender_id = 10 AND recipient_id = 10);

缺陷:1.我无法在代码中使用DISTINCT ON。 2.它将分组为一行(我不确定是否真的会发生):

sender_id | recipient_id
------------------------
    10    |      5
     9    |      6

我不知道如何解决这个问题。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

您可以使用least()greatest()首先获得较低的ID,最后获得较高的ID(或者,反之亦然)。

使用DISTINCT

SELECT DISTINCT
       least(sender_id, recipient_id) least_id,
       greatest(sender_id, recipient_id) greatest_id
       FROM chat;

或者使用GROUP BY,如果您实际上想要聚合某些内容(无论是什么max(message)?):

SELECT least(sender_id, recipient_id) least_id,
       greatest(sender_id, recipient_id) greatest_id,
       ...
       FROM chat
            GROUP BY least(sender_id, recipient_id),
                     greatest(sender_id, recipient_id);