Re: Calculating Minkowski distance between two rows

Поиск
Список
Период
Сортировка
От Adrian Klaver
Тема Re: Calculating Minkowski distance between two rows
Дата
Msg-id 8d37c573-aacb-ac2b-1c5a-d381f446d4d8@aklaver.com
обсуждение исходный текст
Ответ на Re: Calculating Minkowski distance between two rows  (Babak Alipour <babak.alipour@gmail.com>)
Список pgsql-general
On 04/25/2016 07:26 AM, Babak Alipour wrote:
> That is correct. The function I've written only works when the two
> tables are named table_train and table_test; is it possible to
> generalize that to take in any two tables?

I'm heading out the door and off the top of my head:

1) Get tables names as text.

2) Get the row conditions as text.

3) Use EXECUTE to build a query string:
http://www.postgresql.org/docs/9.5/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

In particular:
"A cleaner approach is to use format()'s %I specification for table or
column names (strings separated by a newline are concatenated):"

http://www.postgresql.org/docs/9.5/static/functions-string.html#FUNCTIONS-STRING-FORMAT

4) SELECT the result INTO a record variable:

http://www.postgresql.org/docs/9.5/interactive/plpgsql-declarations.html#PLPGSQL-DECLARATION-RECORDS

5) Do your calculations

6) Not considered, validating that number of table columns are the same
and the types are compatible.

>
> Thanks in advance.
>
>>Babak
>
> On Mon, Apr 25, 2016 at 10:24 AM, Adrian Klaver
> <adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>> wrote:
>
>     On 04/25/2016 07:07 AM, Babak Alipour wrote:
>
>         Greetings everyone,
>
>         I'm a novice plpgsql user.
>         For an application, I'm trying to write a user-defined function that
>         takes a row of some table (let's say with k fields) and takes
>         another
>         row from another table (again with k fields); then calculate the
>         Euclidean, Manhattan or generally Minkowski distance (with some
>         p) and
>         then return an integer.
>         I've written this:
>
>         CREATE FUNCTION euclidean_distance(row1 table_train, row2
>         table_test,
>         OUT distance DOUBLE PRECISION) AS $$
>         DECLARE
>         tmp DOUBLE PRECISION;
>         BEGIN
>         FOR col IN SELECT column_name FROM information_schema.columns WHERE
>         table_name=table_train LOOP
>            tmp := (row1.col - row2.col);
>            distance += tmp*tmp;
>         END LOOP;
>         distance := sqrt(distance);
>         END;
>         $$ LANGUAGE plpgsql;
>
>         Could anyone please help me fix this function so that I can pass
>         any two
>         rows of two tables (with same number of columns) and have their
>         distance
>         returned.
>
>
>     You are already doing that, so do you mean any two rows of any two
>     tables?
>
>
>         Best regards,
>         Babak Alipour
>
>         --
>         */Babak Alipour ,/*
>         */University of Florida/*
>
>
>
>     --
>     Adrian Klaver
>     adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>
>
>
>
>
> --
> */Babak Alipour ,/*
> */University of Florida/*


--
Adrian Klaver
adrian.klaver@aklaver.com


В списке pgsql-general по дате отправления:

Предыдущее
От: Merlin Moncure
Дата:
Сообщение: Re: Columnar store as default for PostgreSQL 10?
Следующее
От: Francisco Olarte
Дата:
Сообщение: Re: Calculating Minkowski distance between two rows