3

SQLクエリを使用しています

    SELECT round(avg(int_value)) AS modal_value FROM t;

モーダル値を取得することは、もちろん正しいことではありませんが、何らかの結果を表示するための最初のオプションです。

だから、私の質問は、「どうすれば正しいことをするのですか?」です。


PostgreSQL 8.3+では、このユーザー定義の集計を使用してmodeを定義できます。

CREATE FUNCTION _final_mode(anyarray) RETURNS anyelement AS $f$
    SELECT a FROM unnest($1) a
    GROUP BY 1  ORDER BY COUNT(1) DESC, 1
    LIMIT 1;
$f$ LANGUAGE 'sql' IMMUTABLE;
CREATE AGGREGATE mode(anyelement) (
  SFUNC=array_append,  STYPE=anyarray,
  FINALFUNC=_final_mode, INITCOND='{}'
);

ただし、ユーザー定義の平均として、大きなテーブルでは遅くなる可能性があります (合計/カウントを組み込みの AVG 関数と比較してください)。 PostgreSQL 9 以降では、統計モード値を計算するための直接 (組み込み) 関数はありませんか? おそらく使用pg_stats...のようなことをする方法

    SELECT (most_common_vals(int_value))[1] AS modal_value FROM t;

pg_stats VIEW はこの種のタスクに使用できますか (1 回でも手動で) ?

4

5 に答える 5

10

PostgreSQL 9.4 以降、組み込みの集計関数がありますmode。のように使われます

SELECT mode() WITHIN GROUP (ORDER BY some_value) AS modal_value FROM tbl;

順序集合集約関数の詳細については、次を参照してください。

36.10.3. 順序集合集合体

組み込みの順序集合集合関数

古いバージョンの Postgres を扱うための他の回答を参照してください。

于 2016-12-11T14:45:05.797 に答える
1

次のようなものを試すことができます:

SELECT int_value, count(*)
FROM t
GROUP BY int_value
ORDER BY count(*) DESC
LIMIT 1;

その背後にあるアイデア - すべてのカウントを取得しint_value、次にそれらを並べ替え (最大のものから順にcount)、LIMIT最初の行のみにクエリを実行してint_value、最大のカウントのみを取得します。

于 2013-04-24T11:23:29.187 に答える
0

質問の紹介で、私はこのリンクを優れたSQLコード化されたソリューションで引用しました(そして@IgorRomanchenkoはこの回答で同じアルゴリズムを使用しました)。@ClodoaldoNeto は「新しい解決策」を示していますが、私がコメントしているようにスカラーとメジャーのためのものであり、現在の質問に対する答えではありません。

貼り付けて 2 か月と ~40Views、新しい問題はありません...

結論

このページの情報 (およびそれ以上の情報がないことの証拠) と引用されたリンクのみを使用した結論。概要:

  1. ユーザー定義の集計mode()で十分です。組み込み (コンパイル済み) バージョンは必要ありません。

  2. 最適化のためのインフラストラクチャはありません。ビルトインはユーザー定義以外のことを行います。


次のようなコンテキストで、引用された SQL 集計関数をテストしました

SELECT mode(some_value) AS modal_value FROM t;

そして、私のテストでは、それは高速でした...したがって、「組み込み関数」( STATS_MODEOracleのような)を正当化するのではなく、「統計パッケージ」の需要コンテキストでのみ-ただし、インストールに時間とメモリを費やす場合何か私はR言語を提案します。

別の暗黙の質問は、統計パッケージの「準備」またはいくつかの PostgreSQL インフラストラクチャ ( pg_statsなど) の使用に関するものでした... 「標準的な回答」の良い手がかりは、@IgorRomanchenko のコメントにあります: " pg_stat(...)正確な値ではなく、見積もりの​​みが含まれています。」そのため、モード機能はインフラストラクチャを利用できません。

注:「モーダル間隔」については、別の関数を使用できることを覚えておく必要があります。@ClodoaldoNeto の回答を参照してください。

于 2013-06-19T03:05:25.003 に答える