完全な質問の書き直し
First()集計関数を探しています。
ここで、ほとんど機能するものを見つけました。
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
);
問題は、varchar(n)列がfirst()関数を通過するときに、単純なvarchar(サイズなし)に変換されることです。関数でクエリをRETURNS SETOF anyelementとして返そうとすると、次のエラーが表示されます。
エラー:クエリの構造がSQL:42804関数結果の型と一致しません。 )RETURN QUERYの31行目
同じwikiページには、上記を置き換える関数のCバージョンへのリンクがあります。インストール方法はわかりませんが、このバージョンで問題を解決できるかどうかは疑問です。
一方、上記の関数を変更して、入力列とまったく同じタイプを返す方法はありますか?
DISTINCT ON
場合、この場合は機能しません。これは集計関数ではなく、実際にデータをフィルタリングするため、一度しか実行できません。