Postgres:计算子查询中的唯一数组项



如果我的子查询foo释放行:-

ID, USERS 
1   {23129}
2   {23142}
3   {23300,23300}
4   {23129,23300}

如何使用窗口函数(如:-)获得查询中唯一用户的计数

SELECT ... FROM ( <subquery> ) FOO

我试过这个:-

array_length(array_agg(array_length(array(SELECT Distinct unnest(users))),1)) over(), 1)

但是得到阵列尺寸不相同的错误

注:我无法更改子查询来解决这个问题。

我可以获得数组中的ID,如下所示:-

string_to_array(string_agg(array_to_string(user_ids, ','), ',') over(),',')

但它们并不明显。

您过于复杂了-您可以运行数组,然后从中查询一个不同的计数:

SELECT COUNT(DISTINCT u)
FROM   (SELECT UNNEST(users) AS u
FROM   mytable) t

您可以在简单的SQL函数中始终使用已知的alghoritm:

create or replace function array_unique_elements(arr anyarray)
returns integer
language sql immutable
as $$
select count(distinct a)::int
from unnest(arr) a 
$$;

用途:

select *, array_unique_elements(users)
from (
values
(1, '{23129}'::int[]),
(2, '{23142}'),
(3, '{23300,23300}'),
(4, '{23129,23300}')
) foo (id, users)
id |     users     | array_unique_elements 
----+---------------+-----------------------
1 | {23129}       |                     1
2 | {23142}       |                     1
3 | {23300,23300} |                     1
4 | {23129,23300} |                     2
(4 rows)

我还是按照Mureinik的建议计算不同的。

关于您得到的错误,这里是array_length:的紧凑语法示例

t=# with a(v) as (values('{1,2}'::int[]),('{2,3}')) 
select array_length(array_agg(distinct unnest),1) from (
select unnest(v) from a
) a;
array_length
--------------
3
(1 row)

当然,不会使用窗口聚合-仅使用GROUP BY

最新更新