Как я могу вычислить среднее число чисел с плавающей запятой во вложенном массиве в столбце варианта - PullRequest
0 голосов
/ 09 июля 2020

У меня есть столбец VARIANT, содержащий ответ JSON от веб-службы. Он содержит вложенный массив со значением с плавающей запятой, которое я хотел бы агрегировать и вернуть как среднее значение. Вот пример команды Snow SQL, которую я использую:

select 
value:disambiguated.id,
value:mentions 
from TABLE(
    FLATTEN(input => 
                   PARSE_JSON('{    "entities": [{"count": 2,"disambiguated": {"id": 123},"label": "Coronavirus Disease 2019","mentions": [{"confidence": 0.5928,}, {"confidence": 0.5445,}],"type": "MEDICAL"}]}'):entities
                 )
)

, которая возвращает:

VALUE:DISAMBIGUATED.ID  VALUE:MENTIONS
123                     [    {      "confidence": 0.5928    },    {      "confidence": 0.5445    }  ]

То, что я хотел бы вернуть, это что-то с двумя значениями «уверенности». в среднем 0,56825. Я смог добавить второй оператор FLATTEN , который изолировал массив «упоминаний» и позволил мне извлечь каждое значение «достоверности». Кажется, я не могу понять, как сгруппировать записи для расчета среднего. Хотел бы использовать встроенную функцию AVG () , если это возможно. Заранее благодарим вас за любую помощь, которую вы можете оказать.

1 Ответ

1 голос
/ 09 июля 2020

Используя ваш пример, вы можете использовать LATERAL FLATTEN для создания необходимых вам плоских полей, а затем агрегировать, как обычно. В этом примере я группирую по идентификатору, который есть в данных, но вы также можете использовать y.index или z.index в зависимости от того, какие из них вы хотите сгруппировать для своего AVG().

WITH x AS (
    SELECT PARSE_JSON('{    "entities": [{"count": 2,"disambiguated": {"id": 123},"label": "Coronavirus Disease 2019","mentions": [{"confidence": 0.5928,}, {"confidence": 0.5445,}],"type": "MEDICAL"}]}') as json_str
)
SELECT
y.value:disambiguated.id as id,
avg(z.value:confidence)
from x,
LATERAL FLATTEN(input => json_str:entities) y,
LATERAL FLATTEN(input => y.value:mentions) z
GROUP BY id
;
...