Ниже для стандартного SQL BigQuery и использования аналитических функций вместо самостоятельного объединения
#standardSQL
WITH temp AS (
SELECT
EXTRACT(YEAR FROM t.date) year,
EXTRACT(WEEK FROM t.date) week,
Store_Name,
Number_Of_Vistors
FROM `project.dataset.table` t
)
SELECT Store_Name, year, week,
(Number_Of_Vistors - ANY_VALUE(Number_Of_Vistors)
OVER(PARTITION BY Store_Name, year ORDER BY week RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING)
) / Number_Of_Vistors AS variance
FROM temp t
Вы можете проверить, поиграть с выше, используя фиктивные данные, как в примере ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT DATE '2018-12-02' `date`, 'abc' Store_Name, 11 Number_Of_Vistors UNION ALL
SELECT '2018-12-09', 'abc', 22 UNION ALL
SELECT '2018-12-16', 'abc', 33 UNION ALL
SELECT '2018-12-23', 'abc', 44 UNION ALL
SELECT '2018-12-30', 'abc', 55 UNION ALL
SELECT '2019-01-06', 'abc', 66 UNION ALL
SELECT '2019-01-13', 'abc', 77 UNION ALL
SELECT '2019-01-20', 'abc', 88
), temp AS (
SELECT
EXTRACT(YEAR FROM t.date) year,
EXTRACT(WEEK FROM t.date) week,
Store_Name,
Number_Of_Vistors
FROM `project.dataset.table` t
)
SELECT Store_Name, year, week,
(Number_Of_Vistors - ANY_VALUE(Number_Of_Vistors)
OVER(PARTITION BY Store_Name, year ORDER BY week RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING)
) / Number_Of_Vistors AS variance
FROM temp t
ORDER BY Store_Name, year, week
с результатом
Row Store_Name year week variance
1 abc 2018 48 null
2 abc 2018 49 0.5
3 abc 2018 50 0.3333333333333333
4 abc 2018 51 0.25
5 abc 2018 52 0.2
6 abc 2019 1 null
7 abc 2019 2 0.14285714285714285
8 abc 2019 3 0.125
Примечание: поскольку из вашего вопроса не ясно, как именно представлены ваши данные - я предполагаю, что у вас есть по одной строке в неделю в год на магазин
Вы должны быть в состоянии отрегулировать выше, по мере необходимости, к вашим фактическим типам данных / сценарию использования