type - update enum postgresql
¿Puede utilizar una función de comparación de Postgres personalizada para las cláusulas ORDER BY? (2)
En Python, puedo escribir una función de comparación de ordenación que devuelve un elemento en el conjunto {-1, 0, 1}
y pasarlo a una función de ordenación como la siguiente:
sorted(["some","data","with","a","nonconventional","sort"], custom_function)
Este código ordenará la secuencia según el orden de intercalación que defino en la función.
¿Puedo hacer el equivalente en Postgres?
p.ej
SELECT widget FROM items ORDER BY custom_function(widget)
Edición: Ejemplos y / o punteros a la documentación son bienvenidos.
Podrías hacer algo como esto
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;
En primer lugar, defina el parámetro que será su columna de pedido con AS
. Podría ser una función o cualquier expresión SQL . Luego ORDER BY
expresión ORDER BY
y listo!
En mi opinión, esta es la forma más fácil de hacer este pedido.
Sí, puede, incluso puede crear un índice funcional para acelerar la clasificación.
Edición: Ejemplo simple:
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)));
El manual está lleno de ejemplos de cómo usar sus propias funciones, simplemente comience a jugar con él.