2016-10-11 45 views
1

我想测试一些逻辑,在BigQuery中使用虚拟表和数据。我已经成功使用子查询上的通配符

WITH dummy AS (SELECT 1 AS a) 
SELECT a FROM dummy 

这样,通过使用WITH语句比较复杂,我可以尝试在这个虚拟表中的一些不同的逻辑。

现在我碰壁了,因为我有一些数据在不同的分区中,我想测试。使用标准的SQL我可以这样做:

SELECT a 
FROM 
    `dummy_*` 
WHERE 
    _TABLE_SUFFIX BETWEEN '20161001' AND '20161003' 

但是我真的很希望能够做的子查询同样在WITH子句:

WITH 
    dummy_20161001 AS (SELECT 1 AS a UNION ALL SELECT 4 AS a), 
    dummy_20161002 AS (SELECT 7 AS a UNION ALL SELECT 10 AS a) 
SELECT a FROM dummy_* 
WHERE 
    _TABLE_SUFFIX BETWEEN '20161001' AND '20161003' 

有什么我可以代替_TABLE_SUFFIX与做到这一点,还是有任何其他方式来创建表分区的虚拟表示?

回答

1

在我看来,下面可以满足您的测试需求。至少这是一个选项:O)

WITH 
    dummy_20161001 AS (SELECT 1 AS a UNION ALL SELECT 2 AS a), 
    dummy_20161002 AS (SELECT 3 AS a UNION ALL SELECT 4 AS a), 
    dummy_20161003 AS (SELECT 5 AS a UNION ALL SELECT 6 AS a), 
    dummy_20161004 AS (SELECT 7 AS a UNION ALL SELECT 8 AS a), 
    `dummy_*` as (
    SELECT *, '20161001' as _TABLE_SUFFIX FROM dummy_20161001 UNION ALL 
    SELECT *, '20161002' as _TABLE_SUFFIX FROM dummy_20161002 UNION ALL 
    SELECT *, '20161003' as _TABLE_SUFFIX FROM dummy_20161003 UNION ALL 
    SELECT *, '20161004' as _TABLE_SUFFIX FROM dummy_20161004 
) 
SELECT a 
FROM `dummy_*` 
WHERE 
    _TABLE_SUFFIX BETWEEN '20161001' AND '20161003' 
+0

这看起来不错:)我跑这个,它的工作。你能否澄清一下,'dummy_ *'表不会在BQ中创建,所以我不需要在之后删除? – binnisb

+1

没错 - 没有在这里创建表格 –

0

_TABLE_SUFFIX和(如果使用的是分区表 - 仅在BigQuery的的_PARTITIONTIME)伪列工作管理的表。

是否可以将样例数据写入多个表或单个分区表(使用SELECT查询与destination_table)?之后,你应该能够使用伪列。