将行中的几个属性转换为 Oracle 中的列
Transposing few attributes in rows to columns in Oracle
我有一个订单table,其记录如下:
UPDATE_DATE ORDER_ID FIELD_NAME FIELD_VALUE
17-07-20 300009086 Order Stage Shipped
15-07-20 300009086 Order Stage Provisioned
14-07-20 300009086 Order Stage Order Created
14-07-20 300009086 Customer Name XYZ Corp
因此可以看出,对于单个订单 (300009086) 我们在 table 中有多个记录,每个记录对应于订单的每个特定属性。同样可以看出,当特定属性发生变化时(例如,上述示例数据中的 Order Stage),我们会在 table.
中创建一条附加记录
现在,我有一个目标 table,它看起来像下面给出的那个,它包含如下所示的记录 -
UPDATE_DATE ORDER_ID FIELD_NAME OLD_FIELD_VAL NEW_FIELD_VALUE
17-07-20 300009086 Order Stage Provisioned Shipped
15-07-20 300009086 Order Stage Order Created Provisioned
14-07-20 300009086 Order Stage - Order Created
14-07-20 300009086 Customer Name - XYZ Corp
因此目标 table 包含 2 个不同的列,旧值和新值,我们需要将源中的当前值记录和前一个值记录转置到目标 table 中的一行中,以便更容易报告这些数据。
所以想得到一些建议,什么是编写 SQL 来执行此转置的最佳方法。如果有人可以对此提出一些想法,将不胜感激。提前致谢。
您可以使用 lag()
:
select
update_date,
order_id,
field_name,
lag(field_value)
over(partition by order_id, field_name order by update_date) as old_field_value
field_value as new_field_value
from mytable
我有一个订单table,其记录如下:
UPDATE_DATE ORDER_ID FIELD_NAME FIELD_VALUE
17-07-20 300009086 Order Stage Shipped
15-07-20 300009086 Order Stage Provisioned
14-07-20 300009086 Order Stage Order Created
14-07-20 300009086 Customer Name XYZ Corp
因此可以看出,对于单个订单 (300009086) 我们在 table 中有多个记录,每个记录对应于订单的每个特定属性。同样可以看出,当特定属性发生变化时(例如,上述示例数据中的 Order Stage),我们会在 table.
中创建一条附加记录现在,我有一个目标 table,它看起来像下面给出的那个,它包含如下所示的记录 -
UPDATE_DATE ORDER_ID FIELD_NAME OLD_FIELD_VAL NEW_FIELD_VALUE
17-07-20 300009086 Order Stage Provisioned Shipped
15-07-20 300009086 Order Stage Order Created Provisioned
14-07-20 300009086 Order Stage - Order Created
14-07-20 300009086 Customer Name - XYZ Corp
因此目标 table 包含 2 个不同的列,旧值和新值,我们需要将源中的当前值记录和前一个值记录转置到目标 table 中的一行中,以便更容易报告这些数据。
所以想得到一些建议,什么是编写 SQL 来执行此转置的最佳方法。如果有人可以对此提出一些想法,将不胜感激。提前致谢。
您可以使用 lag()
:
select
update_date,
order_id,
field_name,
lag(field_value)
over(partition by order_id, field_name order by update_date) as old_field_value
field_value as new_field_value
from mytable