1

中央値を計算するには、Advantage-Database で集計関数を作成する必要があります。

SELECT 
    group_field
  , MEDIAN(value_field) 
FROM 
  table_name
GROUP BY 
  group_field

私が見つけている解決策は、使用されているSQLエンジンに非常に固有のもののようです。

4

2 に答える 2

2

ヘルプ ファイルで確認できるように、ADS には組み込みの中央値集計関数はありません。

http://devzone.advantagedatabase.com/dz/webhelp/Advantage10.1/index.html

この問題を解決するには、独自のストアド プロシージャまたは SQL スクリプトを作成する必要があります。

次の質問に対する受け入れられた答えが解決策になるかもしれません: MySQL で中央値を計算する簡単な方法

于 2012-06-19T11:47:00.063 に答える
0

この回答を更新して、結合を回避し、一部のデータをjsonオブジェクトに保存するソリューションを使用しました。

解決策 #1 (2 つの選択と結合、1 つはカウントの取得、もう 1 つはランキングの取得)

これは少し長くなりますが、機能し、かなり高速です。

SELECT  x.group_field, 
        avg(
            if( 
                x.rank - y.vol/2 BETWEEN 0 AND 1, 
                value_field, 
                null
            )
        ) as median
FROM (
    SELECT  group_field, value_field, 
            @r:= IF(@current=group_field, @r+1, 1) as rank, 
            @current:=group_field
    FROM (
        SELECT group_field, value_field
        FROM table_name
        ORDER BY group_field, value_field
    ) z, (SELECT @r:=0, @current:='') v
) x, (
    SELECT group_field, count(*) as vol 
    FROM table_name
    GROUP BY group_field
) y WHERE x.group_field = y.group_field
GROUP BY x.group_field

解決策 #2 (json オブジェクトを使用してカウントを保存し、結合を回避します)

SELECT group_field, 
    avg(
        if(
            rank - json_extract(@vols, path)/2 BETWEEN 0 AND 1,
            value_field,
            null
        )
    ) as median
FROM (
    SELECT group_field, value_field, path, 
        @rnk := if(@curr = group_field, @rnk+1, 1) as rank,
        @vols := json_set(
            @vols, 
            path, 
            coalesce(json_extract(@vols, path), 0) + 1
        ) as vols,
        @curr := group_field
    FROM (
        SELECT p.group_field, p.value_field, concat('$.', p.group_field) as path
        FROM table_name
        JOIN (SELECT @curr:='', @rnk:=1, @vols:=json_object()) v
        ORDER BY group_field, value_field DESC
    ) z
) y GROUP BY group_field;
于 2013-11-16T18:42:36.767 に答える