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

Posted

技术标签:

【中文标题】Postgres:计算子查询中的唯一数组条目【英文标题】:Postgres: count unique array entries from subquery 【发布时间】:2018-03-20 20:30:42 【问题描述】:

如果我的子查询 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 BAR) FROM ( &lt;subquery&gt; ) FOO, unnest(FOO.USERS) AS BAR 【参考方案1】:

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

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)

【讨论】:

【参考方案2】:

我也想像 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

【讨论】:

【参考方案3】:

您使事情变得过于复杂 - 您可以取消嵌套数组,然后从中查询不同的计数:

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

【讨论】:

谢谢,但是子查询不能改

以上是关于Postgres:计算子查询中的唯一数组条目的主要内容,如果未能解决你的问题,请参考以下文章

使用主查询的字段计算子查询中的字段

postgres:使用子查询设置数组的值?

SQL连接表的最大数量限制是适用于整个查询,还是单独计算子查询?

根据子数组的位置和数组的第一个元素计算子数组元素的总和

如何查询子数组中的条目与所有条件匹配的文档?

如何计算子查询返回的行数?