Ниже для BigQuery Standard SQL
#standardSQL
SELECT
id,
campaign,
COUNT(1) campaign_frequency,
(
SELECT COUNT(1)
FROM `project.dataset.table`
WHERE id = t.id
AND dt BETWEEN DATE_SUB(t.campaign_start, INTERVAL 3 MONTH) AND DATE_SUB(t.campaign_start, INTERVAL 1 DAY)
) total_lookback_frequency,
campaign_start,
campaign_end,
MIN(dt) AS first_date,
MAX(dt) AS end_date
FROM `project.dataset.table` t
GROUP BY id, campaign, campaign_start, campaign_end
Вы можете протестировать, поиграть с выше, используя фиктивные данные из вашего вопроса, как показано ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, DATE '2018-01-01' dt, 1 campaign, DATE '2018-01-01' campaign_start, DATE '2018-02-03' campaign_end UNION ALL
SELECT 1, '2018-02-01', 2, '2018-02-01', '2018-02-03' UNION ALL
SELECT 1, '2018-02-02', 2, '2018-02-01', '2018-02-03' UNION ALL
SELECT 1, '2018-02-03', 2, '2018-02-01', '2018-02-03' UNION ALL
SELECT 2, '2018-01-23', 1, '2018-01-01', '2018-02-03' UNION ALL
SELECT 2, '2018-02-03', 2, '2018-02-01', '2018-02-03'
)
SELECT
id,
campaign,
COUNT(1) campaign_frequency,
(
SELECT COUNT(1)
FROM `project.dataset.table`
WHERE id = t.id
AND dt BETWEEN DATE_SUB(t.campaign_start, INTERVAL 3 MONTH) AND DATE_SUB(t.campaign_start, INTERVAL 1 DAY)
) total_lookback_frequency,
campaign_start,
campaign_end,
MIN(dt) AS first_date,
MAX(dt) AS end_date
FROM `project.dataset.table` t
GROUP BY id, campaign, campaign_start, campaign_end
-- ORDER BY id, campaign