Выберите запрос для группировки записей в выводе json, используя BigQuery - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть секционированная таблица datetime в BigQuery со схемой вроде:

timestamp      TIMESTAMP  REQUIRED  
customer_id    STRING     REQUIRED  
plant_id       STRING     REQUIRED  
inverters      RECORD     REPEATED  
inverters. id  STRING     REQUIRED
...

Итак, если я сделаю SELECT * FROM my_table`, она сгенерирует JSON со структурой, подобной:

[
  {
    "timestamp": "2019-10-20 20:00:00 UTC",
    "customer_id": "5d3f1aee5f70740d54c416e1",
    "plant_id": "5d658cb25f70747626153e83",
    "inverters": [
      {
        "id": "5d77e3225f70746ec02bd8e7",
        ...
      },
      ...
    ]
  },
  ...
]

И этот формат хорошо работает в большинстве моих случаев использования, кроме одного.

Итак, если бы я хотел идентификаторы всех инверторов, я бы сделал

SELECT DISTINCT id 
FROM `my_table`
CROSS JOIN UNNEST(inverters)

Но мне также нужны временные метки, сгруппированные по инвертору, но если я сделаю, скажем, вложенный запрос для получения временных меток по id, например:

SELECT inverter, timestamp
FROM (
  SELECT DISTINCT id 
  FROM `my_table`
  CROSS JOIN UNNEST(inverters)
) AS inverter, `my_table`

, тогда результирующий json будет :

[
  {
    "inverter": {
      "id": "5d791a505f70744c233b819d"
    },
    "timestamp": "2020-01-21 11:15:00 UTC"
  },
  {
    "inverter": {
      "id": "5d791a505f70744c233b819d"
    },
    "timestamp": "2020-01-21 00:20:00 UTC"
  },
  {
    "inverter": {
      "id": "5d791a505f70744c233b819d"
    },
    "timestamp": "2020-01-21 04:05:00 UTC"
  },
  ...
]

Это было длинное введение.

Вопрос в следующем: есть ли способ запроса данных, чтобы результат запроса выглядел примерно так?

[
  {
    "inverter": {
      "id": "5d791a505f70744c233b819d",
      "timestamp": [
        "2020-01-21 11:15:00 UTC",
        "2020-01-21 00:20:00 UTC",
        "2020-01-21 04:05:00 UTC",
        ...
      ]
    },
  ...
]

1 Ответ

1 голос
/ 17 февраля 2020

Это то, что вы хотите?

SELECT inverter.id, ARRAY_AGG(timestamp)
FROM `my_table` t CROSS JOIN
     UNNEST(t.inverters) inverter
GROUP BY inverter.id;

Вы говорите, что SELECT * возвращает JSON. Я думаю, что это функция вашего API. Когда вы используете API BigQuery, вы не видите JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...