我有一个有两列的表:
name
,percentage
我在此表中有100行,并且想要创建一个查询,选择带有最小百分比值的5行和带有最大百分比的5行值。
通常情况下,我会使用limit
和offset
执行此操作,但它只会选择我要搜索的结果组中的一个。我想知道是否有办法选择两者。
我一直在寻找解决方案,我想到了FETCH,但我并没有真正成功地使用正确的方法。
答案 0 :(得分: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 BY
和LIMIT
应用于SELECT
查询的嵌套UNION
语句。我引用the manual here:
如果是,则可以将
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
的对等组中获取任意行。