Je voudrais créditer la réponse de @robin-salih, je l'ai utilisée et l'implémentation de min pour int, pour construire le code suivant :
CREATE OR REPLACE FUNCTION min(uuid, uuid)
RETURNS uuid AS $$
BEGIN
IF $2 IS NULL OR $1 > $2 THEN
RETURN $2;
END IF;
RETURN $1;
END;
$$ LANGUAGE plpgsql;
create aggregate min(uuid) (
sfunc = min,
stype = uuid,
combinefunc = min,
parallel = safe,
sortop = operator (<)
);
C'est presque la même chose, mais tire parti de l'index B-tree, donc select min(id) from tbl
fonctionne en quelques millis.
P.S. Je ne suis pas un expert de pgsql, peut-être que mon code est erroné, revérifiez avant de l'utiliser en production, mais j'espère qu'il utilise correctement les index et l'exécution parallèle. Je l'ai créé uniquement à partir d'un exemple de code, sans creuser dans la théorie derrière les agrégats dans PG.