Postgresql:查询以了解值的哪一部分是 larger/smaller

Postgresql: Query to know which fraction of the values are larger/smaller

我想查询我的数据库以了解 table 的哪些元素 fraction/percentage 比给定值 larger/smaller。

例如,假设我有一个具有以下架构的 table 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;

但我想用单个查询来完成,以避免 post 处理结果。

我找到了聚合函数 PERCENT_RANK,它完全符合我的要求:

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

如果您只想在单个查询中使用它们,请使用 UNION

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

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

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

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

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

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