代码之家  ›  专栏  ›  技术社区  ›  Adam Hopkinson

使用bigquery对日期数组执行子查询

  •  0
  • Adam Hopkinson  · 技术社区  · 7 年前

    我有一个表,其中存储销售目标-这些通常按月设置,但按天输入-这意味着每日目标是月目标除以天数。

    这是一种输入目标的劳动密集型方法,因此我要重新创建具有开始日期和结束日期的表:

    WITH targets AS (
      SELECT DATE '2018-01-01' AS dateStart, DATE '2018-01-31' AS dateEnd, 'uk' AS market, NUMERIC '1550' AS quantity
      UNION ALL SELECT '2018-02-01', '2018-02-28', "uk", 560
    )
    

    在我的查询中,我需要生成一个日期数组( dateStart dateEnd ,然后对于数组中的每个日期,应用市场并将目标除以数组中的日期数-但我无法使其正常工作。我想做的是:

    SELECT 
      *,
      (SELECT market FROM targets WHERE dr IN GENERATE_DATE_ARRAY(targets.dateStart, targets.dateEnd, INTERVAL 1 DAY)) AS market,
      (SELECT SAFE_DIVIDE(budget, COUNT(GENERATE_DATE_ARRAY(targets.dateStart, targets.dateEnd, INTERVAL 1 DAY)) FROM targets WHERE dr IN GENERATE_DATE_ARRAY(targets.dateStart, targets.dateEnd, INTERVAL 1 DAY)) AND targets.market = market AS budget
    FROM UNNEST(GENERATE_DATE_ARRAY(targets.dateStart, targets.dateEnd, INTERVAL 1 DAY)) AS dr
    

    这意味着更少的数据输入和更少的行在源表中(这是一个google表,所以最终将达到限制)。谢谢你的帮助。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mikhail Berlyant    7 年前

    下面是bigquery标准sql

    #standardSQL
    WITH targets AS (
      SELECT DATE '2018-01-01' AS dateStart, DATE '2018-01-31' AS dateEnd, 'uk' AS market, NUMERIC '1550' AS quantity
      UNION ALL SELECT '2018-02-01', '2018-02-28', "uk", 560
    )
    SELECT market, day, quantity / days AS target
    FROM targets, 
      UNNEST(GENERATE_DATE_ARRAY(dateStart, dateEnd)) day, 
      UNNEST([DATE_DIFF(dateEnd, dateStart, DAY) + 1]) days
    ORDER BY market, day