#sql #google-bigquery
#sql #google-bigquery
Вопрос:
У меня есть запрос в BigQuery. Я хочу знать средние значения за квартал. В моем текущем SQL значения за период Q1 для id1
одинаковы для id2
.
Это то, что у меня было, и значения были хорошими:
row|averages|quarter|identifier
-----------------------------
1 | 10 | 1 | id1
2 | 20 | 2 | id1
3 | 30 | 1 | id2
4 | 40 | 2 | id2
Вот SQL, который я написал для вышеупомянутой структуры, которая дает хорошие значения:
WITH
index_cal AS (
SELECT
values-01,
kind,
EXTRACT (QUARTER FROM date) as QUARTER,
date,
FROM
`project.dataset.table`,
geom AS (
SELECT
identifier
FROM
`project.dataset.table2` )
SELECT
AVG(values-01) AS averages,
QUARTER AS quarter,
geom. identifier as identifier
FROM
index_cal as g
INNER JOIN
geom
ON
INTERSECTS(g.kind,
geom. identifier)
GROUP BY
identifier
quarter
Я хотел сгруппировать значения для каждого квартала по идентификатору таким образом, чтобы каждый идентификатор имел только 1 связанную строку:
row | averages | quarter | identifier
----------------------------------
1 | 10 | 1 | id1
| 20 | 2 |
----------------------------------
2 | 30 | 1 | id2
| 40 | 2 |
----------------------------------
Чтобы получить желаемую структуру таким образом, чтобы id1 имел только 1 связанную строку и аналогично для всех идентификаторов, я написал этот SQL-запрос:
WITH
index_cal AS (
SELECT
values-01,
kind,
EXTRACT (QUARTER FROM date) as QUARTER,
date,
FROM
`project.dataset.table`,
geom AS (
SELECT
identifier
FROM
`project.dataset.table2` )
SELECT
ARRAY(
SELECT
AS STRUCT AVG(values-01) AS averages,
QUARTER AS quarter
FROM
index_cal
GROUP BY
QUARTER ) as INDEX,
geom. identifier as identifier
FROM
index_cal AS g
INNER JOIN
geom
ON
INTERSECTS(g.kind,
geom. identifier)
GROUP BY
identifier
При выполнении этого запроса я получаю средние значения для всех идентификаторов, сгруппированных по кварталам, так что значения (например, 15 и 25 в данном случае) повторяются для всех идентификаторов:
row | averages | quarter | identifier
----------------------------------
1 | 15 | 1 | id1
| 25 | 2 |
----------------------------------
2 | 15 | 1 | id2
| 25 | 2 |
----------------------------------
2 | 15 | 1 | id3
| 25 | 2 |
----------------------------------
В конце я хочу ответить на среднее значение values-01
за квартальный интервал на основе identifier
. В настоящее время они одинаковы для любого значения identifier
.
Комментарии:
1. Привет, Пранай. Я все еще пытаюсь понять вопрос. Есть ли способ упростить дело?
2. Привет, Фелипе, отредактировал мой вопрос. При необходимости я могу предоставить более подробную информацию.
Ответ №1:
Решил это с помощью ARRAY_AGG в исходном запросе, который выдавал исходные значения
with final_cal as (WITH
index_cal AS (
SELECT
values-01,
kind,
EXTRACT (QUARTER FROM date) as QUARTER,
date,
FROM
`project.dataset.table`,
geom AS (
SELECT
identifier
FROM
`project.dataset.table2` )
SELECT
AVG(values-01) AS averages,
QUARTER AS quarter,
geom. identifier as identifier
FROM
index_cal as g
INNER JOIN
geom
ON
INTERSECTS(g.kind,
geom. identifier)
GROUP BY
identifier
quarter)
SELECT identifier, ARRAY_AGG(STRUCT(averages, quarter)) from final_cal GROUP BY identifier