我正在尝试构建一个 SQL 查询,其中根据特定条件选择唯一行,但我不知道如何构建它。
这些行具有 varchar
对话 ID、varchar
发送者和 varchar
接收者。
我需要结果是对话 ID 以及发件人和收件人的所有不同组合,但收件人列中重复的发件人或反之亦然被视为相同。
例如:
ID ,Sender ,Recip
-------------------------
Convo1 ,PersonA ,PersonB
Convo1 ,PersonB ,PersonA
Convo1 ,PersonC ,PersonA
Convo1 ,PersonC ,PersonA
Convo1 ,PersonA ,PersonC
Convo1 ,PersonC ,PersonA
Convo2 ,PersonB ,PersonD
Convo2 ,PersonB ,PersonA
将返回的查询:
Convo1, PersonA, PersonB
Convo1, PersonC, PersonA
Convo2, PersonB, PersonD
Convo2, PersonB, PersonA
最佳答案
在标准 SQL 中,您可以使用 case
语句来执行此操作:
select id, (case when sender < recip then sender else recip end) as person1,
(case when sender < recip then recip else sender end) as person2
from conversations
group by id,
(case when sender < recip then sender else recip end),
(case when sender < recip then recip else sender end);
许多数据库支持 least()
和 greatest()
函数,这可以简化代码:
select id, least(sender, recip) as person1, greatest(sender, recip) as person2
from conversations
group by id, least(sender, recip) as person1, greatest(sender, recip);
关于用于选择唯一值组合的 SQL 查询,忽略两列顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26472760/