postgresql 有没有一种方法可以将单个字段中的值组合起来,并始终按照顺序创建每个ID的所有移动?

new9mtju  于 2023-04-11  发布在  PostgreSQL
关注(0)|答案(2)|浏览(167)

在SQL中,我有一个表,看起来像这样:
enter image description here
我想根据“Seq_Number”将每个“id_Parent_Record”的“Value_New”中的值组合起来,这意味着它应该始终从1开始。
例如,637454609993200总共有4个移动,用于“Field_Changed”=“Task_Workflow”。
预期的输出应该完全像这样:
初始转介-〉IRU -〉批准调整-〉结算
这是我目前所在的代码:

select ac."id_Parent_Record"
,ac."Field_Changed"
,ac."Value_Previous"
,ac."Value_New"
,ac."Changed_Date" 
,row_number() over (partition by "id_Parent_Record", "Field_Changed"  order by "Changed_Date" asc) as "Seq_Number"
from public.api_changelog ac
where ac."Field_Changed" IN ('_id_Matter','Task_Workflow')
and ac."id_Parent_Record" = '637454609993200';

预期输出应包含一个名为“Transitions”的新字段,对于帐户637454609993200,每行的值应如下所示,其中Field_Change等于Task_Workflow:

初始转介-〉IRU -〉批准调整-〉结算

nxagd54h

nxagd54h1#

STRING_AGG函数应该能够实现这一点。
每个Value_New应该由' -> '分隔,并且应该由Changed_Date字段排序。需要包含GROUP BY

select ac."id_Parent_Record"
,ac."Field_Changed"
, STRING_AGG(ac."Value_New", ' -> ' ORDER BY ac."Changed_Date" asc) AS "Transitions"
from public.api_changelog ac
where ac."Field_Changed" IN ('_id_Matter','Task_Workflow')
and ac."id_Parent_Record" = '637454609993200'
GROUP BY ac."id_Parent_Record"
,ac."Field_Changed"
;

输出:
| id_Parent_Record|字段_已更改|过渡|
| --------------|--------------|--------------|
| 637454609993200|_id_Matter|637417579791350|
| 637454609993200|任务_工作流|初始转介-〉IRU -〉批准调整-〉结算|
CTE可用于将表重新联接回原始结果集

WITH transitions AS (
    select ac."id_Parent_Record"
    ,ac."Field_Changed"
    , STRING_AGG(ac."Value_New", ' -> ' ORDER BY ac."Changed_Date" asc) AS "Transitions"
    from public.api_changelog ac
    where ac."Field_Changed" IN ('_id_Matter','Task_Workflow')
    and ac."id_Parent_Record" = '637454609993200'
    GROUP BY ac."id_Parent_Record"
    ,ac."Field_Changed"
)

select ac."id_Parent_Record"
,ac."Field_Changed"
,ac."Value_Previous"
,ac."Value_New"
,ac."Changed_Date" 
, t."Transitions"
from public.api_changelog ac
INNER JOIN transitions t
    ON ac."id_Parent_Record" = t."id_Parent_Record"
    AND ac."Field_Changed" = t."Field_Changed"
;
id_Parent_Record字段_已更改价值_上一页价值_新变更日期过渡
637454609993200_id_Matter6374175797913502021-01-07 2021-01-07637417579791350
637454609993200任务_工作流初次转诊2021-01-05 2021-01-05 2021-01-05初始转介-〉IRU -〉批准调整-〉结算
637454609993200任务_工作流初次转诊IRU2021-01-06 2021-01-06初始转介-〉IRU -〉批准调整-〉结算
637454609993200任务_工作流IRU批准的调整2021-03-26 2021-03-26初始转介-〉IRU -〉批准调整-〉结算
637454609993200任务_工作流批准的调整结算2021-06-02 2021-06-02初始转介-〉IRU -〉批准调整-〉结算
uujelgoq

uujelgoq2#

对于一个典型的数据仓库维度表,数据应该是这样的。我并不是要你接受答案,而是要展示它如何简化你的查询。不需要查询。
surr_key(代理项键)= Seq_Number
nat_key(natural key)= id_Parent_Record

surr_key   nat_key   Task_Workflow         _id_Matter    Transition
1          200       Initial Referral      350           Initial Referral
2          200       IRU                   350           Initial Referral > IRU
3          200       Adjustment Approved   350           Initial Referral > IRU > Adjustment Approved
4          200       Settlement            350           Initial Referral > IRU > Adjustment Approved > Settlement

与您的数据模型相比,此数据模型的一个缺点是,当操作数据库(上游)中的列发生更改、添加新列或删除列时,需要重新构建上面的维度表,并使用新DDL移动数据。

相关问题