在一个语句中为一列选择两组不同的行?

时间:2012-11-17 15:08:29

标签: sql postgresql union-all

我有一个有两列的表:
namepercentage

我在此表中有100行,并且想要创建一个查询,选择带有最小百分比值的5行和带有最大百分比的5行值。

通常情况下,我会使用limitoffset执行此操作,但它只会选择我要搜索的结果组中的一个。我想知道是否有办法选择两者。

我一直在寻找解决方案,我想到了FETCH,但我并没有真正成功地使用正确的方法。

1 个答案:

答案 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 BYLIMIT应用于SELECT查询的嵌套UNION语句。我引用the manual here

  如果是,则可以将

ORDER BYLIMIT附加到子表达式   括在括号中。没有括号,这些条款将是   用于应用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的对等组中获取任意行。