ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-11-12 02:25:20  阅读:209  来源: 互联网

标签:google-bigquery join sql mysql


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

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

关于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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有