gpt4 book ai didi

mysql - Google Big Query 中是否有任何方法可以在不重复使用* 右边的任何行的情况下一对一地进行左外连接?

转载 作者:可可西里 更新时间:2023-11-01 08:09:53 25 4
gpt4 key购买 nike

我们在一个表中有一组患者,我们希望将他们中的每个患者与另一表中的患者完全匹配 - 但我们需要成对的患者,因此我们不能将一个患者与多个其他患者匹配。

Left Outer Joins 添加匹配项的每个匹配项 - 将患者匹配到每个其他可能的匹配项 - 因此我们需要一些其他方法。

我们在 SO 上看到很多关于匹配第一行的答案 - 但这使我们只能将一个患者与多个其他患者匹配 - 而不是我们需要的一对。

在 Google Big Query 的表之间是否有任何可能的方法来创建配对匹配而不重复? (即使它需要多个步骤。)


附录:这里是示例表。 如果能看到使用它的 SQL 示例会很棒。

这是需要的。

Example Source Tables:

Table A
PatientID Race Gender
1 A F
2 B M
3 A F

Table B
PatientID
4 A F
5 A F
6 B M


Results Table Desired:

Table C
A.PatientID B.PatientID_Match
1 4
2 6
3 5

澄清:表 A 中的患者必须匹配表 B 中的患者。(他们不能匹配自己表中的患者。)

最佳答案

select      min (case tab when 'A' then patientID end)  as A_patientID  
,min (case tab when 'B' then patientID end) as B_patientID

from (select tab
,patientID
,rank() over (order by race,gender) r
,row_number() over (partition by tab,race,gender order by patientID) rn

from ( select 'A' as tab,A.* from A
union all select 'B' as tab,B.* from B
) t
) t

group by t.r
,t.rn

-- having count(*) = 2
;

+-------------+-------------+
| a_patientid | b_patientid |
+-------------+-------------+
| 3 | 5 |
+-------------+-------------+
| 2 | 6 |
+-------------+-------------+
| 1 | 4 |
+-------------+-------------+

主要思想-

两个表中的行按其属性(种族、性别)分组。
这是使用 RANK 函数完成的。

在每组属性(种族、性别)中,行被排序,每个表,由他们的 patientid 。

+-----+-----------+------+--------+    +---+----+
| tab | patientid | race | gender | | r | rn |
+-----+-----------+------+--------+ +---+----+

+-----+-----------+------+--------+ +---+----+
| A | 1 | A | F | | 1 | 1 |
+-----+-----------+------+--------+ +---+----+
| B | 4 | A | F | | 1 | 1 |
+-----+-----------+------+--------+ +---+----+

+-----+-----------+------+--------+ +---+----+
| A | 3 | A | F | | 1 | 2 |
+-----+-----------+------+--------+ +---+----+
| B | 5 | A | F | | 1 | 2 |
+-----+-----------+------+--------+ +---+----+

+-----+-----------+------+--------+ +---+----+
| A | 2 | B | M | | 5 | 1 |
+-----+-----------+------+--------+ +---+----+
| B | 6 | B | M | | 5 | 1 |
+-----+-----------+------+--------+ +---+----+

在最后阶段,行根据它们的 RANK (r) 和 ROW_NUMBER (rn) 值被分成组 (GROUP BY),这意味着每个组都有来自每个表的一行(或者只有一行,如果有的话)没有来自另一个表的匹配行)。

关于mysql - Google Big Query 中是否有任何方法可以在不重复使用* 右边的任何行的情况下一对一地进行左外连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40836309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com