【问题标题】:How to iterate bigquery code on monthly basis?如何按月迭代 bigquery 代码?
【发布时间】:2017-10-29 00:51:09
【问题描述】:

我想按月迭代下面的代码,这样我就可以为每个月下线的月度数据制作一个表格仪表板:

SELECT
    Deal_ID,
    Category,
    MONTH(date),
    YEAR(date)
FROM [big-query-1233:BI_Automation.live_deals_history_since_15_sep] 
WHERE
    MONTH(date) = 4 AND
    Deal_ID NOT IN (
        SELECT Deal_id
        FROM [big-query-1233:BI_Automation.live_deals_history_since_15_sep]  
        WHERE MONTH(date) = 5
    )

【问题讨论】:

  • 您的 group by 聚合没有意义,因为您的 select 子句中没有任何聚合函数。
  • 是的,这是一个愚蠢的错误
  • 也许你应该告诉我们你想在这里做什么。
  • 在上面的代码中,我通过与no比较来计算出5月份下线的客户数量。 4 月份的客户数量,正如您在我的代码中看到的那样。我只想按月循环上面的代码,以便我可以分别检查每个月。
  • @devpratim 。 . .您可能会看到您的代码如何与某些问题相关,但我当然没有。我建议你再问一个问题,提供样本数据、期望的结果,并解释你想做什么。

标签: sql google-bigquery tableau-api


【解决方案1】:

以下是 BigQuery 标准 SQL,避免使用 JOIN,而是使用分析函数

#standardSQL
SELECT
  Deal_ID, Category, 
  EXTRACT(MONTH FROM month) AS month,
  EXTRACT(YEAR FROM month) AS year  
FROM (
  SELECT
    Deal_ID, Category, month,
    LEAD(month) OVER(PARTITION BY Deal_ID, Category ORDER BY month) AS next_month
  FROM (
    SELECT
      Deal_ID, Category,
      DATE_TRUNC(DATE, MONTH) month
    FROM `big-query-1233.BI_Automation.live_deals_history_since_15_sep` 
    GROUP BY Deal_ID, Category, month
  )
)
WHERE DATE_DIFF(next_month, month, MONTH) > 1
-- ORDER BY month, Deal_ID, Category  

您可以使用下面的虚拟数据测试/玩它

#standardSQL
WITH `big-query-1233.BI_Automation.live_deals_history_since_15_sep` AS (
  SELECT 1 AS Deal_ID, 1 AS Category, DATE '2017-01-01' AS DATE UNION ALL
  SELECT 1, 1, DATE '2017-01-02' UNION ALL
  SELECT 1, 1, DATE '2017-02-02' UNION ALL
  SELECT 1, 1, DATE '2017-02-15' UNION ALL
  SELECT 1, 1, DATE '2017-03-15' UNION ALL
  SELECT 1, 1, DATE '2017-04-15' UNION ALL
  SELECT 1, 1, DATE '2017-06-15' UNION ALL
  SELECT 1, 1, DATE '2017-07-07' UNION ALL
  SELECT 1, 1, DATE '2017-08-22' UNION ALL
  SELECT 1, 1, DATE '2017-12-12' 
)
SELECT
  Deal_ID, Category, 
  EXTRACT(MONTH FROM month) AS month,
  EXTRACT(YEAR FROM month) AS year  
FROM (
  SELECT
    Deal_ID, Category, month,
    LEAD(month) OVER(PARTITION BY Deal_ID, Category ORDER BY month) AS next_month
  FROM (
    SELECT
      Deal_ID, Category,
      DATE_TRUNC(DATE, MONTH) month
    FROM `big-query-1233.BI_Automation.live_deals_history_since_15_sep` 
    GROUP BY Deal_ID, Category, month
  )
)
WHERE DATE_DIFF(next_month, month, MONTH) > 1
ORDER BY month, Deal_ID, Category    

注意:不清楚您需要 COUNT 个客户还是只需要客户列表
以上为您提供列表
但是如果你需要 COUNTs - 你只需添加额外的 GROUP BY 和 COUNT,因为它在下面

#standardSQL
SELECT
  Category, 
  EXTRACT(MONTH FROM month) AS month,
  EXTRACT(YEAR FROM month) AS year,  
  COUNT(Deal_ID) AS customers
FROM (
  SELECT
    Deal_ID, Category, month,
    LEAD(month) OVER(PARTITION BY Deal_ID, Category ORDER BY month) AS next_month
  FROM (
    SELECT
      Deal_ID, Category,
      DATE_TRUNC(DATE, MONTH) month
    FROM `big-query-1233.BI_Automation.live_deals_history_since_15_sep` 
    GROUP BY Deal_ID, Category, month
  )
)
WHERE DATE_DIFF(next_month, month, MONTH) > 1
GROUP BY month, year, Category
ORDER BY month, year, Category  

【讨论】:

  • 我不确定这对 OP 是否重要,但我也担心查询在年份边界附近的行为。使用解析函数解决方案处理它的一种方法是通过year * 12 + month 订购。
  • 尽管我在内部选择中将其别名为一个月,但实际上它仍然是日期截断为月份,所以这里已经处理好了:o) - 我在这里有点懒惰来更好的命名:o)
【解决方案2】:

希望这将有助于您入门。请注意,它使用标准 SQL 而不是带有 BigQuery 的旧版 SQL:

SELECT
  Deal_ID,
  ‎Category,
  ‎EXTRACT(MONTH FROM date) AS month,
  ANY_VALUE(EXTRACT(YEAR FROM date)) AS year
FROM `big-query-1233.BI_Automation.live_deals_history_since_15_sep` AS t1
WHERE NOT EXISTS (
  SELECT 1
  FROM `big-query-1233.BI_Automation.live_deals_history_since_15_sep` AS t2
  ‎WHERE
    t1.Deal_ID = t2.Deal_ID AND
    ‎DATE_ADD(DATE_TRUNC(t1.date, MONTH), INTERVAL 1 MONTH) =
  ‎    DATE_TRUNC(t2.date, MONTH)
)
GROUP BY Deal_ID, Category, month
ORDER BY month, Deal_ID;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2023-02-09
    • 2010-12-27
    • 2021-06-21
    • 2021-05-12
    • 2015-03-03
    • 2017-01-09
    • 2018-03-16
    相关资源
    最近更新 更多