如何命令Google bigquery显示时间序列数据的所有行(不省略行)

时间:2019-01-31 03:22:27

标签: sql google-bigquery

我在Google Big Query中使用了一个简单的命令来按商品和按月份显示按商店显示的销量,但是由于某些商品未被购买,因此省略了月份。因此,我想知道所有月份都在编码。 enter image description here

现在,我尝试通过构建时间索引和item_code并与商店交叉连接来解决问题,但是如果我将其与所有项目代码一起应用,则必须是大量行。

SELECT bp_no,sales_month,sales_year,sum(report_qty) AS volume
FROM my_table 
WHERE sales_year between 2016 and 2017 and bp_no is not null and report_qty is not null 
GROUP BY bp_no,sales_month,sales_year
ORDER BY bp_no,sales_year, sales_month

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用WITH语句创建一个临时映射表,该语句将保存yearmonthstoreitem的元数据。它会稍作引导,但应返回您的预期结果。

查询

WITH META AS (
    SELECT DISTINCT
      YEAR,
      MONTH,
      STORE,
      ITEM,
    FROM
     `project.dataset.your_table`,
     UNNEST(GENERATE_ARRAY(1,12)) AS MONTH,
     UNNEST(GENERATE_ARRAY(2016,2017) AS YEAR
    ORDER BY 1,2
)

SELECT
   META.YEAR,
   META.MONTH,
   META.STORE,
   META.ITEM,
   SUM(DATA.QUANTITY)
FROM
  META 
  LEFT JOIN `project.dataset.your_table` AS DATA ON META.MONTH = DATA.MONTH 
                                                    AND META.YEAR = DATA.YEAR 
                                                    AND META.ITEM = DATA.ITEM 
                                                    AND META.STORE = DATA.STORE
GROUP BY
  1,2,3,4 

如果要查看其他时间跨度,显然可以在年份的GENERATE_ARRAY函数中修改上限和下限。

它还假设您的月份的格式为1,2,3,...,12,并且YEARMONTH的类型均为int64。如果没有,您将不得不CAST将这些文件提交到INT64

输出

enter image description here

其他信息

答案 1 :(得分:1)

以下是用于BigQuery标准SQL

#standardSQL
SELECT 
  bp_no,
  sales_month,
  sales_year,
  SUM(IFNULL(report_qty, 0)) AS volume
FROM (SELECT DISTINCT bp_no FROM `project.dataset.my_table`),
UNNEST(GENERATE_ARRAY(1, 12)) sales_month,
UNNEST(GENERATE_ARRAY(2016, 2017)) sales_year
LEFT JOIN `project.dataset.my_table` 
USING(bp_no, sales_month, sales_year)
GROUP BY bp_no, sales_month, sales_year