【BigQuery】累積合計、累積件数、移動平均など

SUM(累積合計)

WITH
	stock_summary AS (
		SELECT DATE('2026-01-01') AS date, 1 AS store_id, 100 AS stock_count UNION ALL
		SELECT DATE('2026-02-01') AS date, 1 AS store_id, 200 AS stock_count UNION ALL
		SELECT DATE('2026-03-01') AS date, 1 AS store_id, 300 AS stock_count UNION ALL
		SELECT DATE('2026-04-01') AS date, 2 AS store_id, 400 AS stock_count
	)
SELECT
	date,
  store_id,
  stock_count,
  SUM (stock_count) OVER (PARTITION BY store_id ORDER BY date) AS total_stock_count
FROM
	stock_summary
;

COUNT(累積件数)

WITH
	stock_summary AS (
		SELECT DATE('2026-01-01') AS date, 1 AS store_id, 100 AS stock_count UNION ALL
		SELECT DATE('2026-02-01') AS date, 1 AS store_id, 200 AS stock_count UNION ALL
		SELECT DATE('2026-03-01') AS date, 1 AS store_id, 300 AS stock_count UNION ALL
		SELECT DATE('2026-04-01') AS date, 2 AS store_id, 400 AS stock_count
	)
SELECT
	date,
  store_id,
  stock_count,
  COUNT (stock_count) OVER (PARTITION BY store_id ORDER BY date) AS total_record_count
FROM
	stock_summary
;

AVG(移動平均)

WITH
	stock_summary AS (
		SELECT DATE('2026-01-01') AS date, 1 AS store_id, 100 AS stock_count UNION ALL
		SELECT DATE('2026-02-01') AS date, 1 AS store_id, 200 AS stock_count UNION ALL
		SELECT DATE('2026-03-01') AS date, 1 AS store_id, 300 AS stock_count UNION ALL
		SELECT DATE('2026-04-01') AS date, 2 AS store_id, 400 AS stock_count
	)
SELECT
	date,
  store_id,
  stock_count,
  AVG (stock_count) OVER (PARTITION BY store_id ORDER BY date) AS move_count_average
FROM
	stock_summary
;

LAG(前行参照)

WITH
	stock_summary AS (
		SELECT DATE('2026-01-01') AS date, 1 AS store_id, 100 AS stock_count UNION ALL
		SELECT DATE('2026-02-01') AS date, 1 AS store_id, 200 AS stock_count UNION ALL
		SELECT DATE('2026-03-01') AS date, 1 AS store_id, 300 AS stock_count UNION ALL
		SELECT DATE('2026-04-01') AS date, 2 AS store_id, 400 AS stock_count
	)
SELECT
	date,
  store_id,
  stock_count,
  LAG (stock_count) OVER (PARTITION BY store_id ORDER BY date) AS prev_stock_count
FROM
	stock_summary
;

LEAD(後行参照)

WITH
	stock_summary AS (
		SELECT DATE('2026-01-01') AS date, 1 AS store_id, 100 AS stock_count UNION ALL
		SELECT DATE('2026-02-01') AS date, 1 AS store_id, 200 AS stock_count UNION ALL
		SELECT DATE('2026-03-01') AS date, 1 AS store_id, 300 AS stock_count UNION ALL
		SELECT DATE('2026-04-01') AS date, 2 AS store_id, 400 AS stock_count
	)
SELECT
	date,
  store_id,
  stock_count,
  LEAD (stock_count) OVER (PARTITION BY store_id ORDER BY date) AS next_stock_count
FROM
	stock_summary
;