用于选择值的唯一组合的SQL查询,忽略两列次序
问题描述:
我想建立一个SQL查询,其中根据特定条件选择唯一的行,但是我在如何构建它时遇到困难。用于选择值的唯一组合的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
,将返回的查询:
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);
许多数据库支持:
Convo1, PersonA, PersonB
Convo1, PersonC, PersonA
Convo2, PersonB, PersonD
Convo2, PersonB, PersonA
答
在标准SQL中,你会使用case
语句做到这一点least()
和greatest()
函数简化了t他的代码是:
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);
答
一种选择是以某种方式排列对话。由于您的发送者和接收者是varchar
S,按字母顺序似乎的是最简单的:
SELECT DISTINCT
ID,
CASE WHEN Sender <= Recip
THEN Sender
ELSE Recip
AS Person1,
CASE WHEN Sender <= Recip
THEN Recip
ELSE Sender
AS Person2
FROM Conversations
我不得不添加明显得到独特的组合,但除此之外,这个工作太棒了! – user1958698 2014-10-20 19:06:57
@ user1958698。 。 。 “分组”并没有产生独特的结果? – 2014-10-20 21:38:12