2016-09-26 2 views
0

У меня есть таблица, которая выглядит следующим образом:Поворотная колонка Postgresql

username  item_name total_units_per_username  
[email protected] laptop  2 
[email protected] watch  2 
[email protected] phone  3 
[email protected] laptop  3 
[email protected] watch  3 

, что я хотел бы это таблица, которая выглядит следующим образом:

total_units_per_username item_name    frequency 
3      phone, laptop, watch  1 

По существу я хочу повернуть колонну item_name, объединить все значения над total_units_per_username и подсчитать частоту этого события. Я использую Snowflake.

Спасибо!

+0

Как ваши пяти строк включить в эту одну строку? –

+0

Я по существу ищу что-то похожее на функцию LEAD, но не ограничиваюсь следующей строкой, которую я разделяю. Кроме того, поскольку total_units_per_username растет со временем, это не долгосрочное решение. – Julia

ответ

0

Я думаю, что вы хотите два агрегирования:

select numitems, items, count(*) as freq 
from (select username, 
      string_agg(item_name order by item_name, ', ') as items, 
      count(*) as numitems 
     from t 
     group by username 
    ) t 
group by numitems, items; 

EDIT:

Вы также можете сделать это с array_agg():

select numitems, items, count(*) as freq 
from (select username, 
      array_agg(item_name order by item_name) as items, 
      count(*) as numitems 
     from t 
     group by username 
    ) t 
group by numitems, items; 
+0

Вот что я изначально пытался использовать! но мой сервер не поддерживает string_agg. – Julia

+0

@Julia. , , Вы должны использовать старую версию Postgres. 'string_agg()' поддерживается с 9.0, который был выпущен в 2010 году. В любом случае вы можете использовать 'array_agg()' вместо этого. –

Смежные вопросы