Sql Postgres:从子查询中统计唯一数组项

Sql Postgres:从子查询中统计唯一数组项,sql,postgresql,select,subquery,aggregate-functions,Sql,Postgresql,Select,Subquery,Aggregate Functions,如果我的子查询foo释放了行:- ID, USERS 1 {23129} 2 {23142} 3 {23300,23300} 4 {23129,23300} 如何使用窗口函数(例如,以下窗口函数)获取查询中唯一用户的计数:- SELECT ... FROM ( <subquery> ) FOO 但是得到的错误是数组维度不相同 请注意:我无法更改子查询来解决此问题 我可以按如下方式获取数组中的ID:- string_to_array(string_agg(arra

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

ID, USERS 
1   {23129}
2   {23142}
3   {23300,23300}
4   {23129,23300}
如何使用窗口函数(例如,以下窗口函数)获取查询中唯一用户的计数:-

SELECT ... FROM ( <subquery> ) FOO
但是得到的错误是数组维度不相同

请注意:我无法更改子查询来解决此问题

我可以按如下方式获取数组中的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

我倒不如像穆雷尼克建议的那样数一数

关于您得到的错误,这里有一个紧凑的语法示例,使用
数组长度

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
时,您才能在简单的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 
$$;
使用:


感谢您的回答,问题是子查询无法更改。
从()FOO,unest(FOO.USERS)中选择count(distinct BAR)作为BAR
谢谢,但子查询无法更改
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)