Вы можете использовать пользовательскую функцию сравнения Postgres для предложений ORDER BY? - PullRequest
17 голосов
/ 11 сентября 2010

В Python я могу написать функцию сравнения сортировки, которая возвращает элемент в наборе {-1, 0, 1} и передать его функции сортировки следующим образом:

sorted(["some","data","with","a","nonconventional","sort"], custom_function)

Этот код будет сортировать последовательность в соответствии спорядок сортировки, который я определяю в функции.

Могу ли я сделать эквивалент в Postgres?

например,

SELECT widget FROM items ORDER BY custom_function(widget)

Редактировать: Примеры и /или указатели на документацию приветствуются.

Ответы [ 2 ]

13 голосов
/ 11 сентября 2010

Да, вы можете, вы даже можете создать функциональный индекс для ускорения сортировки.

Редактировать: Простой пример:

CREATE TABLE foo(
    id serial primary key,
    bar int
);
-- create some data
INSERT INTO foo(bar) SELECT i FROM generate_series(50,70) i;
-- show the result
SELECT * FROM foo;

CREATE OR REPLACE FUNCTION my_sort(int) RETURNS int 
LANGUAGE sql 
AS
$$
    SELECT $1 % 5; -- get the modulo (remainder)
$$;
-- lets sort!
SELECT *, my_sort(bar) FROM foo ORDER BY my_sort(bar) ASC;

-- make an index as well:
CREATE INDEX idx_my_sort ON foo ((my_sort(bar)));

В руководстве полно примеров, как использовать свои собственные функции, просто начните играть с ним.

0 голосов
/ 21 мая 2018

Вы могли бы сделать что-то вроде этого

SELECT DISTINCT ON (interval_alias) *,
  to_timestamp(floor((extract('epoch' FROM index.created_at) / 10)) * 10) AT
  TIME ZONE 'UTC' AS interval_alias
  FROM index
  WHERE index.created_at >= '{start_date}'
  AND index.created_at <= '{end_date}'
  AND product = '{product_id}'
  GROUP BY id, interval_alias
ORDER BY interval_alias;

Сначала вы определяете параметр, который будет вашим столбцом заказа с помощью AS. Это может быть функция или любое выражение SQL . Затем установите его на ORDER BY выражение, и все готово!

На мой взгляд, это самый плавный способ сделать такой заказ.

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