2

我有一个有 2 列的表:
name,percentage

我在这个表中有 100 行,并且想要进行查询以选择百分比值最小的 5 行和百分比值最大的 5 行。

通常我会这样做limitoffset但它只会选择我寻求的结果组之一。我想知道是否有一种方法可以同时选择两者。

找了一段时间的解决方案,也想到了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 BYLIMIT嵌套查询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.

于 2012-11-17T15:20:09.393 回答