我有一个有 2 列的表:
name
,percentage
我在这个表中有 100 行,并且想要进行查询以选择百分比值最小的 5 行和百分比值最大的 5 行。
通常我会这样做limit
,offset
但它只会选择我寻求的结果组之一。我想知道是否有一种方法可以同时选择两者。
找了一段时间的解决方案,也想到了FETCH,但是我并没有真正成功使用对。
我有一个有 2 列的表:
name
,percentage
我在这个表中有 100 行,并且想要进行查询以选择百分比值最小的 5 行和百分比值最大的 5 行。
通常我会这样做limit
,offset
但它只会选择我寻求的结果组之一。我想知道是否有一种方法可以同时选择两者。
找了一段时间的解决方案,也想到了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
.