中央値を計算するには、Advantage-Database で集計関数を作成する必要があります。
SELECT
group_field
, MEDIAN(value_field)
FROM
table_name
GROUP BY
group_field
私が見つけている解決策は、使用されているSQLエンジンに非常に固有のもののようです。
中央値を計算するには、Advantage-Database で集計関数を作成する必要があります。
SELECT
group_field
, MEDIAN(value_field)
FROM
table_name
GROUP BY
group_field
私が見つけている解決策は、使用されているSQLエンジンに非常に固有のもののようです。
ヘルプ ファイルで確認できるように、ADS には組み込みの中央値集計関数はありません。
http://devzone.advantagedatabase.com/dz/webhelp/Advantage10.1/index.html
この問題を解決するには、独自のストアド プロシージャまたは SQL スクリプトを作成する必要があります。
次の質問に対する受け入れられた答えが解決策になるかもしれません: MySQL で中央値を計算する簡単な方法
この回答を更新して、結合を回避し、一部のデータを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;