我需要按两个不同的列分组并合并。此外,如果具有不同组id的大小与其他大小匹配,则我希望包含该组id的所有行。
例如,由于55在组id 10和组id 20中,我希望将所有结果都包含在组id 20中(即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

我查看了堆栈上的一些other questions并尝试使用row_numberfirst_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

如果你有任何问题,请告诉我。我对所有的方法都持开放态度,谢谢。

最佳答案

我不太确定最终数组中的顺序,但这应该是一个您可以修复的细节:
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

聚合每个group_id的大小
将聚合与自身交叉连接,其中一个大小数组至少有一个成员与另一个成员。这给了你一个你期望的和被描述的表。
group_id分组。

关于postgresql - 有条件的行号或组合组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52771172/

10-15 19:39