【问题标题】:Postgresql: Query to know which fraction of the values are larger/smallerPostgresql:查询以了解哪些值更大/更小
【发布时间】:2017-01-12 23:01:35
【问题描述】:

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

例如,假设我有一个表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;

但我想使用单个查询来完成,以避免对结果进行后处理。

【问题讨论】:

    标签: sql postgresql aggregate-functions ranking


    【解决方案1】:

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

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

    【讨论】:

    • 我看到这个解决方案的问题是,仍然有两个SELECT 查询(可能效率较低?)而且我仍然需要在查询后自己做比率。跨度>
    【解决方案2】:

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

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

    【讨论】:

    • 我真的很喜欢这个解决方案,但是在 Postgres 中我在将 bool 转换为浮动时遇到了问题。我编辑您的解决方案,将其直接转换为 int
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我找到了聚合函数 PERCENT_RANK,这正是我想要的:

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

      【讨论】:

        猜你喜欢
        • 2012-12-30
        • 1970-01-01
        • 2018-06-16
        • 2015-07-12
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多