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

时间:2017-10-09 15:12:41

标签: sql postgresql select subquery aggregate-functions

如果我的子查询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(),',')

但它们并不明显。

3 个答案:

答案 0 :(得分:4)

你过度复杂 - 你可以取消数组,然后从中查询不同的数:

System.IO.Pipes

答案 1 :(得分:1)

您总是可以在一个简单的SQL函数中使用已知的alghoritm:

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)

使用:

class Dashboard {
    static get controller() { return [Dashboard]; }
    static get controllerAs() { return 'vm'; }
    static get template() { return '<ng-transclude></ng-transclude>'; }
    static get transclude() { return true; }

    constructor() {
        this.name="Bob";
    }
}

class InfoPanel {
    static get template() { return '<span>My name is {{vm.value}}!</span>'; }
    static get controller() { return [InfoPanel]; }
    static get controllerAs() { return 'vm'; }
    static get bindings() {
        return {
            value: '<'
        };
    }

    constructor() {
    }
}


angular.module("dashboardApp", [])
    .component("dashboard", Dashboard)
    .component("infoPanel", InfoPanel);

答案 2 :(得分:0)

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