2017-10-09 49 views
2

獨特的數組項。如果我的子查詢富解放行: -Postgres的:指望從子查詢

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(),',') 

但它們並不明顯。

+0

感謝您的答案,問題是子查詢不能改變。 – CitizenFish

+0

'SELECT COUNT(不同BAR)FROM()FOO,UNNEST(FOO.USERS)AS BAR' – Abelisto

回答

1

您可以隨時使用已知alghoritm在一個簡單的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) 
4

你過於複雜的事情 - 你可以UNNEST數組,然後從中查詢重複計數:

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

感謝,但子查詢不能改變 – CitizenFish

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