数据库
首页 > 数据库> > mysql-Google大查询中是否有任何方法可以从左向右一对一连接*无需重复使用*右边的任何行?

mysql-Google大查询中是否有任何方法可以从左向右一对一连接*无需重复使用*右边的任何行?

作者:互联网

我们在一个表中有一组患者,我们希望将每个患者与另一个表中的患者完全匹配-但我们需要成对的患者,因此我们不能将一个患者与一个以上的患者进行匹配.

左外部联接会添加匹配项的每一个匹配项-将患者与其他所有可能匹配的匹配项匹配-因此我们需要其他方法.

关于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函数完成的.

在每组属性(种族,性别)内,按表格的病人ID对行进行排序.

+-----+-----------+------+--------+    +---+----+
| 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),这意味着每个组都有来自每个表的一行(如果没有匹配项,则只有一行)另一张表中的一行).

标签:google-bigquery,join,sql,mysql
来源: https://codeday.me/bug/20191112/2023961.html