Google bigquery bigquery,是否可以使用“子表”?

Google bigquery bigquery,是否可以使用“子表”?,google-bigquery,legacy-sql,Google Bigquery,Legacy Sql,在使用遗留sql的bigquery中,我创建了一个巨大的查询,返回我发布的2018-02-26站点每天访问量的以下显示: Row date name release_date visits_count 1 20180226 a_name 20180226 2179 2 20180227 a_name 20180226 9522 3 20180228 a_name 20180226 1593 4 2

在使用遗留sql的bigquery中,我创建了一个巨大的查询,返回我发布的2018-02-26站点每天访问量的以下显示:

Row  date       name    release_date  visits_count
1    20180226   a_name  20180226      2179
2    20180227   a_name  20180226      9522
3    20180228   a_name  20180226      1593   
4    20180301   a_name  20180226      300    
...
我真正想要的是

Row  name    release   count_release  count_release+1  count_release_rest
1    a_name  20180226  2179           9522             1893  
因此,我希望发布日期的实际访问次数、发布日期后的第二天以及发布日期后的所有访问次数都应该相加。
我不熟悉bigquery,也不熟悉sql。。。。有没有一种方法可以将我的第一次显示定义为子表或类似的东西,以便我可以这样做,或者您建议采用什么方法?

有很多方法可以实现此功能。最简单的方法是将日期与case语句进行比较

select name, sum(case when date = relese_date then 1 else 0) as release_count, 
sum(case when date = DATE_ADD(relese_date,1,"DAY") then 1 else 0) as release_count1
sum(case when date > DATE_ADD(relese_date,1,"DAY") then 1 else 0) as release_count_other

下面是BigQuery标准SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '20180226' date, 'a_name' name, '20180226' release_date, 2179 visits_count UNION ALL
  SELECT '20180227', 'a_name', '20180226', 9522 UNION ALL
  SELECT '20180228', 'a_name', '20180226', 1593 UNION ALL   
  SELECT '20180301', 'a_name', '20180226', 300  
)
SELECT name, release_date, 
  SUM(CASE WHEN date = release_date THEN visits_count END) count_release,
  SUM(CASE WHEN PARSE_DATE('%Y%m%d', date) = DATE_ADD(PARSE_DATE('%Y%m%d', release_date), INTERVAL 1 DAY) THEN visits_count END) count_release_next_day,
  SUM(CASE WHEN PARSE_DATE('%Y%m%d', date) > DATE_ADD(PARSE_DATE('%Y%m%d', release_date), INTERVAL 1 DAY) THEN visits_count END) count_release_rest
FROM `project.dataset.table`
GROUP BY name, release_date   
或者更高版本可以重构,以避免重复PARSE_日期,所以查询看起来更紧凑,更易于管理

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '20180226' date, 'a_name' name, '20180226' release_date, 2179 visits_count UNION ALL
  SELECT '20180227', 'a_name', '20180226', 9522 UNION ALL
  SELECT '20180228', 'a_name', '20180226', 1593 UNION ALL   
  SELECT '20180301', 'a_name', '20180226', 300  
)
SELECT name, release_date, 
  SUM(CASE WHEN date = release_date THEN visits_count END) count_release,
  SUM(CASE WHEN visit = release_next_day THEN visits_count END) count_release_next_day,
  SUM(CASE WHEN visit > release_next_day THEN visits_count END) count_release_rest
FROM `project.dataset.table`, 
UNNEST([STRUCT<visit DATE, release_next_day DATE>(
  PARSE_DATE('%Y%m%d', date), 
  DATE_ADD(PARSE_DATE('%Y%m%d', release_date), INTERVAL 1 DAY))]) x
GROUP BY name, release_date      
Row name    release_date    count_release   count_release_next_day  count_release_rest   
1   a_name  20180226        2179            9522                    1893