Sql 在SELECT中创建数组
我使用的是PostgreSQL 9.1,我有以下数据结构: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值和自身相
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;
可能更清楚。但它通常比较慢。对子查询中的行进行排序适用于像这样的简单查询。更多说明: