【问题标题】:Create array in SELECT在 SELECT 中创建数组
【发布时间】:2012-04-05 11:14:37
【问题描述】:

我使用的是 PostgreSQL 9.1,我有这个数据结构:

A     B
-------
1     a
1     a
1     b
1     c
1     c
1     c
1     d
2     e
2     e

我需要一个产生这个结果的查询:

1    4     {{c,3},{a,2},{b,1},{d,1}}
2    1     {{e,2}}

A=1,总共 4 行,A=1,部分计数(3 行有 c 值,2 行有值,.....)

  • “A”列的不同值
  • 与“A”值相关的所有行的计数
  • 数组包含与“A”值相关的所有元素以及自身的相对计数

数组所需的排序基于每个组的计数(如示例 3,2,1,1)。

【问题讨论】:

    标签: sql postgresql aggregate aggregate-functions postgresql-9.1


    【解决方案1】:

    这应该可以解决问题:

    SELECT a
         , sum(ab_ct)::int AS ct_total
         , count(*)::int   AS ct_distinct_b
         , array_agg(b || ', ' || ab_ct::text) AS b_arr
    FROM  (
        SELECT a, b, count(*) AS ab_ct
        FROM   tbl
        GROUP  BY a, b
        ORDER  BY a, ab_ct DESC, b  -- append "b" to break ties in the count
        ) t
    GROUP  BY a
    ORDER  BY ct_total DESC;
    

    返回:

    • ct_totalb 的总数/a
    • ct_distinct_b:每个 a 的不同 b 计数。
    • b_arrb 的数组加上b 的频率,按b 的频率排序。

    b/a 的总数排序。

    或者,您可以在 PostgreSQL 9.0 或更高版本中使用ORDER BY clause within the aggregate call。喜欢:

    SELECT a
         , sum(ab_ct)::int AS ct_total
         , count(*)::int   AS ct_distinct_b
         , array_agg(b || ', ' || ab_ct::text ORDER BY a, ab_ct DESC, b) AS b_arr
    FROM  (
        SELECT a, b, count(*) AS ab_ct
        FROM   tbl
        GROUP  BY a, b
        ) t
    GROUP  BY a
    ORDER  BY ct_total DESC;

    可能会更清楚。但它通常较慢。子查询中的行排序适用于像这样的简单查询。更多解释:

    【讨论】:

      【解决方案2】:

      这是你需要的:

      SELECT A, COUNT(*), array_agg(b)
      FROM YourTable
      GROUP BY A
      

      【讨论】:

        【解决方案3】:

        也许我遗漏了什么,但应该这样做:

        SELECT a, 
               count(*) as cnt,
               array_agg(b) as all_values
        FROM your_table
        GROUP BY a
        

        【讨论】:

          猜你喜欢
          • 2016-02-06
          • 1970-01-01
          • 2019-07-16
          • 1970-01-01
          • 1970-01-01
          • 2022-07-14
          • 1970-01-01
          • 2016-08-31
          • 1970-01-01
          相关资源
          最近更新 更多