2017-05-18 20 views
8

Aşağıdaki girişi vardır: Ben adıyla gruplama amBirliği

name | count | options 
----------------------- 
user1 | 12 | ['option1', 'option2', 'option3'] 
user2 | 2  | ['option1', 'option3'] 

:

name | count | options 
----------------------- 
user1 | 3  | ['option1', 'option2'] 
user1 | 12 | ['option2', 'option3'] 
user2 | 2  | ['option1', 'option3'] 
user2 | 1  | [] 

aşağıdaki çıktıyı istiyorum. Her grup için, sayım max olarak toplanmalı ve seçenekler union olarak toplanmalıdır. Bu ikincisini nasıl çözdüğümü bulmakta zorlanıyorum.

Şu anda, bu sorgu var:

with data(name, count, options) as (
    select 'user1', 12, array['option1', 'option2']::text[] 
    union all 
    select 'user1', 12, array['option2', 'option3']::text[] 
    union all 
    select 'user2', 2, array['option1', 'option3']::text[] 
    union all 
    select 'user2', 1, array[]::text[] 
) 
select name, max(count) 
from data 
group by name 

http://rextester.com/YTZ45626

Bu kolayca özel bir toplama işlevi tanımlayarak yapılabilir biliyorum ama bir sorguya aracılığıyla bunu yapmak istiyor. unnest() dizisinin temellerini anlıyorum (ve sonuçlarda daha sonra array_agg()), ancak bunu sorgumda nasıl enjekte edeceğimi anlayamıyorum.

+0

Başlat array_agg 'ile()'. Bu senin problemini çözüyor mu? –

cevap

3

Sen seçenekleri ile bir dizi oluşturmak için array_agg(distinct v) kullanarak daha sonra FROM listede unnest(options) kullanarak ve katılmak yanal örtük kullanabilirsiniz:

with data(name, count, options) as (
    select 'user1', 12, array['option1', 'option2']::text[] 
    union all 
    select 'user1', 12, array['option2', 'option3']::text[] 
    union all 
    select 'user2', 2, array['option1', 'option3']::text[] 
    union all 
    select 'user2', 1, array[]::text[] 
) 
select name, array_agg(distinct v) -- the 'v' here refers to the 'f(v)' alias below 
from data, unnest(options) f(v) 
group by name; 
┌───────┬───────────────────────────┐ 
│ name │   array_agg   │ 
├───────┼───────────────────────────┤ 
│ user1 │ {option1,option2,option3} │ 
│ user2 │ {option1,option3}   │ 
└───────┴───────────────────────────┘ 
(2 rows) 
+0

Çok teşekkür ederim. Takma olmayan bir diziyi takma ad ile nasıl yönlendireceğimi anlamadım. –

+1

Şimdi sadece bir tane yerine birden çok diziniz olduğunda bir varyantı deniyorum. Çok çalışacağım ve gerekirse bir soru göndereceğim! –

İlgili konular