Ниже для BigQuery Standard SQL
Это решение позволяет избежать самостоятельных объединений и является достаточно универсальным, чтобы охватить данные за несколько месяцев
#standardSQL
WITH months AS (
SELECT FORMAT_DATE('%Y-%m', month) month
FROM (
SELECT
MIN(PARSE_DATE('%Y-%m', SalesDate)) min_month,
MAX(PARSE_DATE('%Y-%m', SalesDate)) max_month
FROM `project.dataset.table`
), UNNEST(GENERATE_DATE_ARRAY(min_month, max_month, INTERVAL 1 MONTH)) month
)
SELECT CustomerCode, month,
SUM(IF(diff = 0, P_This_Month, 0)) P_This_Month,
SUM(IF(diff = 1, P_This_Month, 0)) P_1_Month_Ago,
SUM(IF(diff = 2, P_This_Month, 0)) P_2_Month_Ago
FROM (
SELECT CustomerCode, P_This_Month, PARSE_DATE('%Y-%m', month) month,
DATE_DIFF(PARSE_DATE('%Y-%m', month), PARSE_DATE('%Y-%m', SalesDate), MONTH) diff
FROM months m CROSS JOIN (
SELECT CustomerCode, SalesDate, SUM(Profit) P_This_Month
FROM `project.dataset.table`
GROUP BY CustomerCode, SalesDate
) t
)
WHERE diff BETWEEN 0 AND 2
GROUP BY CustomerCode, month
Вы можете протестировать, поиграть выше, используя образцы данных изВаш вопрос как в примере ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT 123455666 CustomerCode, '2018-06' SalesDate, 120 Profit UNION ALL
SELECT 123455666, '2018-06', 100 UNION ALL
SELECT 123455666, '2018-05', 10 UNION ALL
SELECT 123455666, '2018-04', 60 UNION ALL
SELECT 666452342, '2018-06', 900 UNION ALL
SELECT 666452342, '2018-05', 1000 UNION ALL
SELECT 666452342, '2018-05', 900 UNION ALL
SELECT 666452342, '2018-04', 800
), months AS (
SELECT FORMAT_DATE('%Y-%m', month) month
FROM (
SELECT
MIN(PARSE_DATE('%Y-%m', SalesDate)) min_month,
MAX(PARSE_DATE('%Y-%m', SalesDate)) max_month
FROM `project.dataset.table`
), UNNEST(GENERATE_DATE_ARRAY(min_month, max_month, INTERVAL 1 MONTH)) month
)
SELECT CustomerCode, month,
SUM(IF(diff = 0, P_This_Month, 0)) P_This_Month,
SUM(IF(diff = 1, P_This_Month, 0)) P_1_Month_Ago,
SUM(IF(diff = 2, P_This_Month, 0)) P_2_Month_Ago
FROM (
SELECT CustomerCode, P_This_Month, PARSE_DATE('%Y-%m', month) month,
DATE_DIFF(PARSE_DATE('%Y-%m', month), PARSE_DATE('%Y-%m', SalesDate), MONTH) diff
FROM months m CROSS JOIN (
SELECT CustomerCode, SalesDate, SUM(Profit) P_This_Month
FROM `project.dataset.table`
GROUP BY CustomerCode, SalesDate
) t
)
WHERE diff BETWEEN 0 AND 2
GROUP BY CustomerCode, month
-- ORDER BY CustomerCode, month
с результатом
Row CustomerCode month P_This_Month P_1_Month_Ago P_2_Month_Ago
1 123455666 2018-04-01 60 0 0
2 123455666 2018-05-01 10 60 0
3 123455666 2018-06-01 220 10 60
4 666452342 2018-04-01 800 0 0
5 666452342 2018-05-01 1900 800 0
6 666452342 2018-06-01 900 1900 800