0

集約モードに等しい値の数を計算する必要があるため、値が 6,7,7,7,8 の場合、モードは 7 で、modal_count は 3、modal_share は 3/5 です。

集計関数としてモーダル カウントまたはモーダル シェアが必要です。

モード関数を変更してモーダル カウントを取得しようとしましたが、int が小さすぎるというエラーが発生します

CREATE OR REPLACE FUNCTION _final_mode_count(anyarray)
  RETURNS anyelement AS
$BODY$
    SELECT COUNT(*)
    FROM unnest($1) a
    GROUP BY a
    ORDER BY COUNT(1) DESC, a
    LIMIT 1;
$BODY$
LANGUAGE 'sql' IMMUTABLE;

-- Tell Postgres how to use our aggregate
CREATE AGGREGATE mode_count(anyelement) (
  SFUNC=array_append, --Function to call for each row. Just builds the array
  STYPE=anyarray,
  FINALFUNC=_final_mode_count, --Function to call after everything has been added to array
  INITCOND='{}' --Initialize an empty array when starting
);

正常に実行されますが、呼び出すと取得されます

FEHLER:  Rückgabetyp von Funktion stimmt nicht überein; deklariert als integer
DETAIL:  Eigentlicher Rückgabetyp ist bigint.
CONTEXT:  SQL-Funktion „_final_mode_share“ beim Start
********** Error **********

FEHLER: Rückgabetyp von Funktion stimmt nicht überein; deklariert als integer
SQL state: 42P13
Detail: Eigentlicher Rückgabetyp ist bigint.
Context: SQL-Funktion „_final_mode_share“ beim Start

どんなアイデアでも大歓迎です

4

1 に答える 1

1

count(*) は bigint を返します。これは、最終的な関数の戻り値の型であるべきです (「RETURNS anyelement AS」の代わりに「RETURNS bigint AS」を使用します)。

于 2013-10-24T15:29:22.263 に答える