【问题标题】:Postgres Pivot based on variable column to create a new idPostgres Pivot 基于变量列创建新id
【发布时间】:2018-04-10 18:43:57
【问题描述】:

我有下表

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,但我不能使用交叉表,并且类型具有的属性数量可能会有所不同,我需要考虑这一点.

有什么建议可以在这里做什么吗?

【问题讨论】:

  • 如何计算新的id?
  • 它们只需要是新的唯一 ID。
  • 您能否澄清“哪些类型具有相同的属性/顺序组合”的意思?
  • 我真的只需要根据属性对类型进行存储。所以所有具有属性 11 和 12 的类型都需要具有相同的 new_id

标签: postgresql join pivot


【解决方案1】:

这行得通,可能有更好的方法来做到这一点,但这是我想到的:

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

输出:

1;1
2;1
3;2
4;2

所以它首先获取每个类型的属性列表,然后获取每个常见属性列表的类型列表(这是确保每个类型共享相同属性的地方),并为每个组获取一个新 id的类型。然后取消嵌套,将每种类型放在一个新行上,该行号就是​​新的 id。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2015-08-01
    • 2021-02-25
    • 2020-08-24
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多