Postgres Pivot基于变量列创建新的id

时间:2018-04-10 18:43:58

标签: postgresql join pivot

我有下表

type     attribute    order
1        11           1
1        12           2
2        11           1
2        12           2
3        15           1
3        16           2
4        15           1
4        16           2

我需要了解哪些类型具有相同的属性,然后为它们分配新的ID。订单栏也可以,如果它有用,因为每个属性只能有一个订单,但您不需要使用它。

理想情况下,结果集如下所示:每个类型都有一个新的id,它基于第一个表中的属性。

type    new_id
1       1
2       1
3       2
4       2

我打算尝试根据订单列来转动表格并连接属性ID以创建新的ID,但我不能使用交叉表,而且类型的属性数量可能会有所不同,我需要为此负责。

有关该怎么做的任何建议?

1 个答案:

答案 0 :(得分:0)

这很有效,可能有更好的方法来实现它,但它是我想到的:

shell=True

输出:

SELECT UNNEST(types) AS type, new_id
FROM (
        SELECT ARRAY_AGG(type) AS types, ROW_NUMBER() OVER() AS new_id
        FROM (
                SELECT type, ARRAY_AGG(attribute ORDER BY attribute) AS attr
                FROM t
                GROUP BY type
        ) x
        GROUP BY attr
) y

首先,它获取每种类型的属性列表,然后获取每个公共属性列表的类型列表(这是确保每个类型共享相同属性的位置)并为每个组获取新的id类型。然后不要把每个类型放在一个新行上,并且该行号是新的id。