Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在SELECT中创建数组_Sql_Postgresql_Aggregate_Aggregate Functions_Postgresql 9.1 - Fatal编程技术网

Sql 在SELECT中创建数组

Sql 在SELECT中创建数组,sql,postgresql,aggregate,aggregate-functions,postgresql-9.1,Sql,Postgresql,Aggregate,Aggregate Functions,Postgresql 9.1,我使用的是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值相关的所有行的计数 数组包含与A值和自身相

我使用的是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值相关的所有行的计数 数组包含与A值和自身相对计数相关的所有元素
数组所需的排序基于每个组的计数,如示例3、2、1、1。

也许我遗漏了什么,但这应该可以做到:

SELECT a, 
       count(*) as cnt,
       array_agg(b) as all_values
FROM your_table
GROUP BY a
这就是您需要的:

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

这应该可以做到:

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_总数:每个a的b总数。 ct_distinct_b:每个a的distinct b计数。 b_arr:b的数组加上b的频率,按b的频率排序。 按a中b的总计数排序

或者,您可以在PostgreSQL 9.0或更高版本中使用。比如:

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;
可能更清楚。但它通常比较慢。对子查询中的行进行排序适用于像这样的简单查询。更多说明: