2

2列のテーブルがあります:
namepercentage

このテーブルには 100 行あり、パーセンテージ値が最小の 5 行とパーセンテージ値が最大の 5行を選択するクエリを作成したいと考えています。

通常は and を使用してこれをlimit行いoffsetますが、求める結果グループの 1 つだけが選択されます。両方を選択する方法があるのだろうか。

私はしばらくの間解決策を探していて、FETCH について考えましたが、実際には正しく使用できません。

4

1 に答える 1

1

UNION ALL

(
SELECT name, percentage
FROM   tbl
ORDER  BY percentage
LIMIT  5
)
UNION ALL
(
SELECT name, percentage
FROM   tbl
ORDER  BY percentage DESC
LIMIT  5
);

クエリのネストされたステートメントに適用するには、括弧必要です。ここでマニュアルを引用します:ORDER BYLIMITSELECTUNION

ORDER BYかっこでLIMIT囲まれている場合は、部分式に付けることができます。UNION括弧がない場合、これらの句は、右側の入力式ではなく、の結果に適用されると見なされます。

UNION(なしALL) は、結果の重複を削除します。だまされないことを期待しなければ、無駄な努力です。

サブクエリrow_number()

SELECT name, percentage
FROM  (
   SELECT *
        , row_number() OVER (ORDER BY percentage) AS rn_min
        , row_number() OVER (ORDER BY percentage DESC) AS rn_max
   FROM   tbl
   ) x
WHERE rn_min < 6
OR    rn_max < 6;

これは、重複を折りたたむようUNIONにします。パフォーマンスは似ていますが、おそらく最初のものより少し遅くなります。

いずれにせよ、制御された方法で同点を解消するために、追加の列で並べ替えます。そのままで、同じ を共有するピアのグループから任意の行を取得しますpercentage

于 2012-11-17T15:20:09.393 に答える