Условный номер строки или комбинация групп BY - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно сгруппировать два разных столбца и объединить.Кроме того, ЕСЛИ размер с другим group_id соответствует другому размеру , тогда я хочу включить ALL из этих строк для этого group_id .

Например, поскольку 55 находится в group_id 10 и group_id 20 Я хочу включить все результаты в group_id 20 (IE 55,88,55,88).

p_id  | group_id | size | the_date    
------+----------+-----------+--------
1     |    10    |  55  | 2012-10-24
1     |    10    |  54  | 2014-08-09
1     |    20    |  55  | 2013-05-20
1     |    20    |  88  | 2014-05-20
1     |    20    |  55  | 2015-05-20
1     |    30    |  33  | 2014-05-20
1     |    30    |  55  | 2015-05-20
1     |    30    |  33  | 2015-05-20
1     |    40    |  99  | 2015-05-20

Я посмотрел на другие вопросы в стеке И попытался использовать row_number и first_value, но ничего не помогло.Ниже мой желаемый результат.

p_id  | group_id | size |       group_id_arr         |         size_arr            |  date_arr    
------+----------+------+----------------------------+-----------------------------+-----------
1     |    10    |   55 | {10,20,30,20,10,30,30,20}  |  {55,55,33,88,55,55,33,55}  | {2012-10-24,2013-05-20,2014-05-20,2014-05-20,2014-08-09,2015-05-20,2015-05-20,2015-05-20}
1     |    40    |   99 |          {40}              |            {99}             | {2015-05-20}

Вот мой DBFiddle , где я пытаюсь добиться следующего, чтобы я мог нарастить.

 rn   |   p_id   | group_id | size | the_date    
------+----------+----------+------+-----------
1     |    1     |    10    |  55  | 2012-10-24     
2     |    1     |    20    |  55  | 2013-05-20     
3     |    1     |    30    |  33  | 2014-05-20     
4     |    1     |    20    |  88  | 2014-05-20     
5     |    1     |    10    |  54  | 2014-08-09     
6     |    1     |    30    |  55  | 2015-05-20     
7     |    1     |    30    |  33  | 2015-05-20     
8     |    1     |    20    |  55  | 2015-05-20     
1     |    1     |    40    |  99  | 2015-05-20     

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.Я открыт для всех подходов, спасибо.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Я не совсем уверен насчет порядка в окончательных массивах, но это должна быть деталь, которую вы можете исправить:

demo: db <> fiddle

WITH sizes as (
    SELECT group_id, the_date, array_agg(size) sizes
    FROM base_table
    GROUP BY group_id, the_date
)
SELECT 
    a_group_id, 
    array_agg(b_group_id order by the_date), 
    array_agg(size order by the_date) as sizes, 
    array_agg(the_date order by the_date)
FROM (
    SELECT 
        a.group_id as a_group_id, 
        b.group_id as b_group_id, 
        unnest(b.sizes) size, b.the_date
    FROM sizes a 
    INNER JOIN sizes b 
    ON a.sizes && b.sizes
) s
GROUP BY a_group_id
  1. Агрегирование размеров по group_id
  2. Крест объединяет агрегаты с самим собой, где один массив размеров имеет по крайней мере один элемент с другим.Это дает вам таблицу, которую вы ожидали и описали.
  3. Группировка по group_id.
0 голосов
/ 12 октября 2018
 select t.id as p_id,min(t.group_id) as group_id, t1.size as size,array_agg(t.size) as size_arr,array_agg(t.group_id) as grp_arr, array_agg(t.date_column) as date_arr from t
 join 
 (select distinct group_id as grp_id, size from t where size=99 or size=55) t1 
 on t1.grp_id=t.group_id 
 group by t.id ,t1.size;

Отметьте это:)

...