【问题标题】:Postgres: count unique array entries from subqueryPostgres:计算子查询中的唯一数组条目
【发布时间】: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

标签: sql postgresql select subquery aggregate-functions


【解决方案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
      

      【讨论】:

      • 谢谢,但是子查询不能改
      猜你喜欢
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2021-06-11
      相关资源
      最近更新 更多