如何从一对删除一条消息?

时间:2018-10-25 19:27:49

标签: sql-server

我有一张这样的桌子:

Sender   Recipient NumMessages
-----------------------------
Vasya    Petya    1
Petya    Vasya    2
Eugen    Petya    3
Petya    Eugen    1
Masha    Sveta    5

如何将这种表转换为一个表,其中任何对都只有一条记录,而该对也有NumMessages字段的总和?无论从一对记录中选择哪个。 这些将成为无向图的边缘。

我需要这个:

Node1    Node2    NumMessages
-----------------------------
Vasya    Petya    3
Eugen    Petya    4
Masha    Sveta    5

如果可以使用,我的实际表中的发件人/收件人字段具有唯一标识符类型ID。 我试图将此表与自身连接起来并计算NumMesages的总和,但那又怎能在一对记录中只留下一条记录?

非常感谢

斯拉瓦

2 个答案:

答案 0 :(得分:0)

这是一个使用case排序的选项,其名称为:

select node1, node2, sum(nummessages)
from (
    select case when sender < recipient then sender else recipient end as node1,
            case when sender < recipient then recipient else sender end as node2,
           nummessages
    from yourtable
) t
group by node1, node2

答案 1 :(得分:0)

您需要为发件人和收件人成对的记录生成/查找共享密钥。

SELECT data.Id, SUM(data.NumMessage)
FROM (
SELECT CONCAT(Sender, Recipient) AS Id, NumMessages
FROM MessagePair
WHERE Sender > Recipient

UNION ALL

SELECT CONCAT(Recipient, Sender) AS Id, NumMessages
FROM MessagePair
WHERE Sender < Recipient
) data
GROUP BY data.Id