2017-10-28 137 views
0

我想重复下面的代码与按月,这样我可以为月度数据的画面仪表盘脱机每个月谁去:如何每月迭代bigquery代码?

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 
    ) 
+0

你GROUP BY聚集是没有意义的,因为你在没有任何聚合函数您选择条款。 –

+0

是的,这是一个愚蠢的错误 –

+0

也许你应该告诉我们你在这里试图做什么。 –

回答

0

希望这将有助于让你开始。注意,它使用标准的SQL,而不是传统的SQL与BigQuery:

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; 
2

下面是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  

注:目前尚不清楚,如果你需要的客户数量或客户只是名单 上面给你列出
但是如果你需要计数 - 你只需要添加额外的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 
+0

我不确定它是否对OP有影响,但我也担心查询在年边界附近的行为。用分析函数解决方案来处理它的一种方法是按年份* 12+月份排序。 –

+0

尽管我把它作为一个月内的内部选择,实际上它仍然是截至月份的日期,所以这已经在这里照顾:o) - 我只是一个懒惰在这里与更好的namings:o ) –