bigQuery根据表2为表1赋值

时间:2017-06-19 16:28:19

标签: google-bigquery

我想根据表1给出更新表2:

Row     sample_id   PIK3CA_features
1       huDBF9DD    chr3_3268035_CT  
2       huDBF9DD    chr3_3268043_AT  
3       huDBF9DD    chr3_3268049_T

表2:

Row     sample_id   chr3_3268035_CT  chr3_3268043_AT  chr3_3268049_C

1       huDBF9DD    1                1                null
2       huDBF9De    null             null             null
3       huDBF9Dw    null             null             null

对于表1中的每一行,如果其samle_id对应于表2,那么我想将表2中的相应PIK3CA_feature更新为1.

如何将表1中的sample_idPIK3CA_features值作为参数传递给SQL命令中的表2?

1 个答案:

答案 0 :(得分:1)

您可以使用UPDATE statement来完成此操作。假设我理解正确,你想要这样的查询:

#standardSQL
UPDATE table2 AS t2
SET
  chr3_3268035_CT =
    IF(t1.PIK3CA_features = 'chr3_3268035_CT', 1, chr3_3268035_CT),
  chr3_3268043_AT =
    IF(t1.PIK3CA_features = 'chr3_3268043_AT', 1, chr3_3268043_AT),
  chr3_3268049_C =
    IF(t1.PIK3CA_features = 'chr3_3268049_C', 1, chr3_3268049_C)
FROM table1 AS t1
WHERE true;

这将根据PIK3CA_features的值将表2中的相应列设置为值1。如果你有很多这些列,你可以使用Python或其他一些编程语言生成查询,或者你可以使用查询生成所有column_name=expression对:

#standardSQL
SELECT
  STRING_AGG(FORMAT('%s=IF(t1.PIK3CA_features="%s",1,%s)',
                    PIK3CA_features, PIK3CA_features, PIK3CA_features), ',\n')
FROM (
  SELECT DISTINCT PIK3CA_features
  FROM table1
);

这会生成如下列表:

chr3_3268035_CT=IF(t1.PIK3CA_features="chr3_3268035_CT",1,chr3_3268035_CT),
chr3_3268049_C=IF(t1.PIK3CA_features="chr3_3268049_C",1,chr3_3268049_C),
chr3_3268043_AT=IF(t1.PIK3CA_features="chr3_3268043_AT",1,chr3_3268043_AT)