SQL 是否可以从事件和参与者列表中生成所有参与者对?如果是的话,怎么办?

问题描述 投票:0回答:1

系统的输出是事件列表以及每个事件参与者的标识符。该输出位于 Excel 工作表的两列中,我已将其导入到 MySQL 表中。第一列是事件标识符,重复 N 次,其中 N 是参加该事件的参与者人数。第二列是参加活动的参与者的唯一标识符。有任意数量的事件以及每个事件的任意数量的参与者。

从这个数据集中,我想使用 SQL 生成所有参与者的成对参与者(即二元组)列表以及将他们聚集在一起的事件。输出将分为三列,其中第一列是事件标识符,第二列是该事件的一个参与者的标识符,第三列是该事件的另一个参与者的标识符。不应有重复的“反向”二元组(例如“1、A、B”和“1、B、A”),也不应存在自对(例如“1、A、A”)。

输入如下所示:

事件ID 人员ID
1 A
1 B
1 E
2 A
2 C
2 E
2 F

SQL 代码的输出如下所示:

事件ID 人员1ID Person2ID
1 A B
1 A E
1 B E
2 A C
2 A E
2 A F
2 C E
2 C F
2 E F

这在 SQL 中可能吗?如果是这样,代码会是什么样子? (这超出了我的 SQL 能力,因为它似乎需要一些过程语言类型的操作来进行计数和/或循环。)

感谢您帮助解决这个问题!

我什至不知道如何开始创建 SQL 代码来完成我需要的处理。我怀疑在计算二元对之前需要设置一个计数器来重置每个“下一个”事件,但是当每个事件的参与者数量不同时,我不知道如何对每个二元对参与者进行组合生成,更不用说如何生成三列输出了。

sql combinatorics
1个回答
0
投票

加入in数据表本身有两种角色:小(我用wee)和大;事件 id 相等且

wee.personid
小于
big.personid

WITH
-- your input ...
indata(EventID,PersonID) AS (
          SELECT 1,'A'
UNION ALL SELECT 1,'B'
UNION ALL SELECT 1,'E'
UNION ALL SELECT 2,'A'
UNION ALL SELECT 2,'C'
UNION ALL SELECT 2,'E'
UNION ALL SELECT 2,'F'
)
-- end of your input, query starts here ...
SELECT
  wee.eventid
, wee.personid AS person1id
, big.personid AS person2id
FROM indata wee
JOIN indata big
  ON wee.eventid =big.eventid
 AND wee.personid<big.personid
ORDER BY 1,2,3
;
事件ID person1id person2id
1 A B
1 A E
1 B E
2 A C
2 A E
2 A F
2 C E
2 C F
2 E F
© www.soinside.com 2019 - 2024. All rights reserved.