【问题标题】:Divide aggregate over sum over columns将聚合除以列的总和
【发布时间】:2020-06-10 16:12:52
【问题描述】:

以下假设是 postgres。

假设我有下表:

CREATE TABLE object (
  object_id       SERIAL  PRIMARY KEY
  object_category integer NOT NULL CHECK(value BETWEEN 1 AND 5)
);

我可以使用以下方法计算每个类别中的对象数量:

SELECT object_category,
       count(object_category) number_of_objects,
  FROM object
 GROUP BY object_category;

,但是我怎样才能找到每个类别中的对象数量与对象总数的比率呢?例如,如果上述查询返回以下结果集:

object_category | number_of_objects
-----------------------------------
              1 |                 5
              2 |                 3
              3 |                 7
              4 |                 2
              5 |                10

,我该如何返回:

object_category | object_ratio
------------------------------
              1 |        0.185
              2 |        0.111
              3 |        0.259
              4 |        0.074
              5 |        0.370

我尝试将上述总和作为子查询计算,但我无法访问 number_of_objects,因为 postgres 抱怨缺少 group-by 子句,我不太明白。有什么帮助吗?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    只使用窗口函数:

    SELECT object_category, COUNT(*), COUNT(*) * 1.0 / SUM(COUNT(*)) OVER ()
    FROM object
    GROUP BY object_category;
    

    【讨论】:

      【解决方案2】:

      您可以使用WINDOW FUNCTIONS

      WITH OBJECTT
           AS (SELECT
                     1 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     1 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     1 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     1 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     1 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     1 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     5 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     5 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     4 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     4 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     4 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     2 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     3 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     2 OBJECT_CATEGORY 
               UNION ALL
               SELECT
                     6 OBJECT_CATEGORY )
      SELECT DISTINCT
             OBJECT_CATEGORY,
             COUNT (*) OVER (PARTITION BY OBJECT_CATEGORY) / COUNT (*) OVER () AS RATIO
        FROM OBJECTT
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        • 1970-01-01
        • 2018-05-22
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多