2列のテーブルがあります:
name
、percentage
このテーブルには 100 行あり、パーセンテージ値が最小の 5 行とパーセンテージ値が最大の 5行を選択するクエリを作成したいと考えています。
通常は and を使用してこれをlimit
行いoffset
ますが、求める結果グループの 1 つだけが選択されます。両方を選択する方法があるのだろうか。
私はしばらくの間解決策を探していて、FETCH について考えましたが、実際には正しく使用できません。
2列のテーブルがあります:
name
、percentage
このテーブルには 100 行あり、パーセンテージ値が最小の 5 行とパーセンテージ値が最大の 5行を選択するクエリを作成したいと考えています。
通常は and を使用してこれをlimit
行いoffset
ますが、求める結果グループの 1 つだけが選択されます。両方を選択する方法があるのだろうか。
私はしばらくの間解決策を探していて、FETCH について考えましたが、実際には正しく使用できません。
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 BY
LIMIT
SELECT
UNION
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
。