Postgresql: евклидово расстояние между массивом (в строке json) и входным массивом - PullRequest
0 голосов
/ 20 октября 2019

Вот структура моей базы данных:

поля данных json в моей базе данных postgres, например:

{"field1": [1, 2, 3, 4], "field2":" toto "} У меня есть другой массив

array_compare = [5, 6, 7, 8] Вот что я хочу сделать: вернуть float из data-> field1 (массив) и array_compare с помощьюэта формула:

SUM ((data-> field1 - array_compare) ^ 2)) ^ (1/2) Я пытался сделать много вещей, которые мне не удалось сделать. Фактически, это способ вычисления евклидова расстояния между массивом (в JSON, я думаю, его нужно привести) и входным массивом

Sincerly

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Вы, вероятно, ищете синтаксис ROWS FROM для табличных функций , который имеет " результаты, возвращаемые в параллельных столбцах ". Вы бы использовали его с json_array_elements для массива JSON и unnest для обычного массива.

SELECT id, (
  SELECT sum(sqrt(x^2 - y::numeric^2)) -- try `array_agg(x || ' ' || y)` for debugging
  FROM ROWS FROM (
    unnest(ARRAY[5, 6, 7, 8]),
    json_array_elements_text(json->'field1')
  ) as r(x, y)
) as distance
FROM example

( онлайн-демонстрация )

0 голосов
/ 20 октября 2019

это должно работать с использованием функции unnest в postgres, чтобы получить таблицу, где вы можете затем применить вычисления, см. https://www.postgresql.org/docs/9.2/functions-array.html

unnest(anyarray)    setof anyelement    expand an array to a set of rows    unnest(ARRAY[1,2])

Тогда вы сможете сделать что-то вроде

SELECT
    unnest(array[1,2,3]) AS unnest_1,
    unnest(array['a','b','c']) AS unnest_2;

выдаст

 unnest_1 | unnest_2 
----------+----------
        1 | a
        2 | b
        3 | c
(3 ROWS)

(Пример взят из https://www.depesz.com/2013/11/24/waiting-for-9-4-support-multi-argument-unnest-and-table-syntax-for-multiple-functions/). Тогда вы можете просто сделать обычный SQL, чтобы получить разницу и суммировать ее.

...