系统的输出是事件列表以及每个事件参与者的标识符。该输出位于 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 代码来完成我需要的处理。我怀疑在计算二元对之前需要设置一个计数器来重置每个“下一个”事件,但是当每个事件的参与者数量不同时,我不知道如何对每个二元对参与者进行组合生成,更不用说如何生成三列输出了。
加入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 |