BigQuery查询同一表两次出现date重复列名报错的解决方法
解决BigQuery中关联查询的重复列名问题
这个问题我碰到过好几次啦!原因很明确:你关联的两个子查询TAB_1和TAB_2都返回了date列,当它们合并到结果集里时就出现了重复列名,而BigQuery不允许结果中有重复的列名。下面给你几个实用的解决办法:
方案1:只保留一个date列(推荐)
既然你的关联条件是TAB_1.date = TAB_2.date,这两个date值是完全相等的,完全没必要保留两个。修改后的查询不仅解决了重复列问题,还改用了更清晰的显式JOIN语法:
SELECT TAB_1.date, TAB_1.grob_r1, TAB_2.grob_r2 FROM ( SELECT date, grob as `grob_r1` FROM `mytab_tbl` WHERE region = "r1" ) AS TAB_1 JOIN ( SELECT date, grob as `grob_r2` FROM `mytab_tbl` WHERE region = "r2" ) AS TAB_2 ON TAB_1.date = TAB_2.date
方案2:给重复的date列重命名
如果出于某些特殊需求你必须保留两个date列(虽然这个场景下其实没必要),可以给其中一个列起个新别名:
SELECT TAB_1.date as date_r1, TAB_2.date as date_r2, TAB_1.grob_r1, TAB_2.grob_r2 FROM ( SELECT date, grob as `grob_r1` FROM `mytab_tbl` WHERE region = "r1" ) AS TAB_1 JOIN ( SELECT date, grob as `grob_r2` FROM `mytab_tbl` WHERE region = "r2" ) AS TAB_2 ON TAB_1.date = TAB_2.date
方案3:用PIVOT简化查询(更优雅的方式)
其实你的需求本质上是按日期聚合不同region的grob值,用BigQuery的PIVOT函数可以一步到位,不用写多个子查询关联:
SELECT date, r1 as grob_r1, r2 as grob_r2 FROM ( SELECT date, region, grob FROM `mytab_tbl` WHERE region IN ("r1", "r2") ) PIVOT ( ANY_VALUE(grob) FOR region IN ("r1", "r2") )
这里的ANY_VALUE适用于每个日期+region只有一条记录的情况,如果同一组合有多条记录,可以换成MAX(grob)、MIN(grob)或者其他适合你的聚合函数。
内容的提问来源于stack exchange,提问作者SubZeno
相关产品推荐
相关产品推荐

