2

投票のあるテーブルがあります。投票は数字のみです (テキストなし、いいえ/いいえなど)。

生データの例

id   | question_id | vote
1    | 63          | 80
2    | 63          | 13
3    | 63          | 992
...
100  | 63          | 900000
101  | 63          | 5

特定の質問の平均を取得したいが、投票の最高と最低の X% を除外したい (例: 5% を除外 - 100 票ごとに平均 90 票だけを除外する) - ID ではなく、最大と投票数の最小値。

上記の表では、900000 と 5 は平均で考慮されません (この質問に対する最高票と最低票であると仮定します)。

4

2 に答える 2

7

このクエリはジョブを実行する必要があります ( SQL Fiddle の例を参照) :

SELECT AVG(vote) FROM
(
  SELECT vote, @r:=@r+1 AS rownum
  FROM votes, (SELECT @r:=0) x
  WHERE question_id = 63
  ORDER BY vote
) x
WHERE rownum > @r * .05
  AND rownum <= @r * .95
;

サブクエリは変数を使用して各レコードに行番号を割り当て、外側のクエリは最小値と最大値を削除します。

于 2013-01-01T10:36:37.790 に答える
0

これは、使用できる基本的な考え方です。

SELECT AVG(vote) AS average
FROM tbl o 
WHERE question_id=?
AND (
   SELECT count(*)
   FROM tbl i
   WHERE o.question_id = i.question_id
   AND o.vote < i.vote 
)/(
   SELECT count(*)
   FROM tbl inner
   WHERE o.question_id = i.question_id
) IS BETWEEN 0.05 AND 0.95
GROUP BY question_id

直観的には、複雑さは投票数で 2 次です (クエリ実行プログラムが最初のサブクエリを最適化できない場合、2 番目のサブクエリの方が最適化が容易です)。

他のデータベース エンジンの中には、クエリで使用できる値として行番号を持つものがあります。これは、線形の複雑さを実現するのに役立つ場合があります。

複数のクエリを使用して、線形の複雑さを実現できる場合もあります。

  1. 質問 ID を使用して合計行数を照会します。
  2. 並べ替えられた順序で 5% と 95% の境界の位置を計算します。
  3. で境界に対応する投票を照会しLIMITます。のおかげで、2 つのクエリを並行して実行できますUNION
  4. 上位投票と下位投票の値を知っている投票の平均をクエリします。

投票が重複している場合は、境界を見つけるためにvote列をベクトルに置き換える必要がある場合があります(これは両方のクエリに適用されます)。vote, ID基本的な考え方は同じです。

于 2013-01-01T10:36:49.990 に答える