Postgresql:查询以了解哪个部分的值更大/更小

时间:2017-01-12 23:01:36

标签: sql postgresql aggregate-functions ranking

我想查询我的数据库,以了解表中元素的哪个分数/百分比大于/小于给定值。

例如,假设我有一个表shopping_list,其中包含以下架构:

   id   integer
 name   text
price   double precision

内容:

id       name  price
 1     banana      1
 2       book     20
 3    chicken      5
 4  chocolate      3

我现在要买一个价格为4的新商品,我想知道这个新商品在购物清单中的排名。在这种情况下,元素将大于元素的50%。

我知道我可以运行两个查询和count元素数量,例如:

-- returns = 4
SELECT COUNT(*)
FROM shopping_list;

-- returns = 2
SELECT COUNT(*)
FROM shopping_list
WHERE price > 4;

但我想用一个查询来做,以避免后处理结果。

4 个答案:

答案 0 :(得分:3)

如果您只想在单个查询中使用UNION

SELECT COUNT(*), 'total'
FROM shopping_list
UNION
SELECT COUNT(*),'greater'
FROM shopping_list
WHERE price > 4;

答案 1 :(得分:1)

最简单的方法是使用avg()

SELECT AVG( (price > 4)::float)
FROM shopping_list;

答案 2 :(得分:0)

我找到了完全符合我想要的聚合函数PERCENT_RANK

SELECT PERCENT_RANK(4) WITHIN GROUP (ORDER BY price)
FROM shopping_list;
-- returns 0.5

答案 3 :(得分:0)

获得两种结果的一种方法如下:

select count(*) as total,
    (select count(*) from shopping_list where price > 4) as greater
from shopping_list

它将使用您指定的名称将两个结果都放在一行中。但是,它确实涉及查询中的查询。