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 ( <subquery> ) 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:计算子查询中的唯一数组条目的主要内容,如果未能解决你的问题,请参考以下文章