Riscrittura completa della domanda
Sto cercando una funzione aggregata First ().
Qui ho trovato qualcosa che quasi funziona:
CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement )
RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$
SELECT $1;
$$;
-- And then wrap an aggregate around it
CREATE AGGREGATE public.first (
sfunc = public.first_agg,
basetype = anyelement,
stype = anyelement
);
Il problema è che quando una colonna varchar (n) passa attraverso la prima funzione (), viene convertita in varchar semplice (senza dimensioni). Tentando di restituire la query in una funzione come RETURNS SETOF anyelement, ottengo il seguente errore:
ERRORE: la struttura della query non corrisponde al tipo di risultato della funzione Estado de SQL: 42804 Detalhe: la variazione del carattere di tipo restituito non corrisponde alla variazione del carattere di tipo previsto (40) nella colonna 2. Contesto: funzione PL / pgSQL vsr_table_at_time (anyelement, timestamp senza fuso orario ) linea 31 a RESTITUISCI QUERY
Nella stessa pagina wiki è presente un collegamento a una versione C della funzione che sostituisce la precedente. Non so come installarlo, ma mi chiedo se questa versione possa risolvere il mio problema.
Nel frattempo, c'è un modo per modificare la funzione sopra in modo che restituisca esattamente lo stesso tipo della colonna di input?
DISTINCT ON
in questo caso non funzionerà. Non è una funzione aggregata, stai effettivamente filtrando i dati e quindi puoi farlo solo una volta.