Рассчитать средние за каждый квартал для каждого связанного значения - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть запрос в 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 Ответ

1 голос
/ 06 апреля 2019

Решено с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...