Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL逐行使用事务日志更新表_Sql_Postgresql_Dynamic Sql - Fatal编程技术网

如何使用SQL逐行使用事务日志更新表

如何使用SQL逐行使用事务日志更新表,sql,postgresql,dynamic-sql,Sql,Postgresql,Dynamic Sql,我有一个表,显示BI数据库中的票证ID及其状态以及分配给谁。这里没有重复项,每个票据的粒度都是相同的 售票处 Ticket_ID Status Assigned_To Date 001 Open Team A 01/01/2020 10:01 002 Working Team B 01/01/2020 10:01 003 Open TeamC 02/01/2020 18:50 004

我有一个表,显示BI数据库中的票证ID及其状态以及分配给谁。这里没有重复项,每个票据的粒度都是相同的

售票处

Ticket_ID   Status  Assigned_To   Date
001         Open    Team A        01/01/2020 10:01
002         Working Team B        01/01/2020 10:01
003         Open    TeamC         02/01/2020 18:50
004         ResolvedTeam B        02/01/2020 19:22
现在,有一个包含每个更改的每日事务日志。但是,字段更改显示为以下行

每日运输日志

Ticket_id       Field_Name      New Value      Date
001           Assigned_to       Team B        02/01/2020 10:23
002           Assigned_to       Team A        02/01/2020 10:23
002           Status            Resolved      02/01/2020 10:24
003           status            Resolved      03/01/2020 10:24
004           Assigned_to       Team C        03/01/2020 13:50
004           Assigned_to       Team A        03/01/2020 13:51
004           Status            Resolved      03/01/2020 13:51
现在,我想编写一个更新脚本,根据日志上的新值更新票证表。考虑到每日事务日志表是每天创建的,我认为set操作将不起作用。我需要SQL脚本在事务日志表上逐行运行,并用新值更新票证表。我知道这是低效的,但是,每天的行数只有几百行。不是几千

我希望看到的结果如下,其中票证表用最新值更新

Ticket\u ID状态分配到\u日期
001公开赛B队2020年1月2日10:23
002决议A队2020年1月2日10时24分
003/01/2020 10:24

004解决团队A 2020年1月3日13:51
您可以使用上的distinct获取每个列的最新更改:

select distinct on (ticket_id, field_name) dtl.*
from daily_transaction_logs dtl
order by ticket_id, date desc;
然后,您可以将其聚合为每张票证一行:

select ticket_id,
       max(new_value) filter (where field_name = 'Assigned_to') as assigned_to,
       max(new_value) filter (where field_name = 'Status') as status,
       max(date) as date
from (select distinct on (ticket_id, field_name) dtl.*
      from daily_transaction_logs dtl
      order by ticket_id, date desc
     ) tf
group by ticket_id;
最后,您可以将其合并到更新中:

update tickets t
    set assigned_to = tt.assigned_to,
        status = tt.status,
        date = tt.date
    from (select ticket_id,
                 max(new_value) filter (where field_name = 'Assigned_to') as assigned_to,
                 max(new_value) filter (where field_name = 'Status') as status,
                 max(date) as date
          from (select distinct on (ticket_id, field_name) dtl.*
                from daily_transaction_logs dtl
                order by ticket_id, date desc
               ) tf
          group by ticket_id
         ) tt
    where tt.ticket_id = t.ticket_id;

您是否可能在同一天有两次状态更新?或者一张分配给“a队”的票,然后在同一天重新分配给“B队”?是的,这是可能的。但我有邮戳,所以我们不能同时有两份作业。我更新了日志表编辑你的问题并显示你想要的结果。我给出了相同的答案,所以我不会重复。添加指向的链接。一个区别-您应该在更新中添加coalesce,因为某些字段可能不会更改(例如,为票证003分配的字段)。谢谢Julius Tuskenis和Gordon。但这不是Microsoft SQL??这对我不起作用。当我运行Gordon脚本的第一部分时,它说“@DataMan上关键字附近的语法不正确。不,这是博士后,正如问题的标签一样。谢谢大家。在MS SQL中,我创建了一个CTE来更新表。如果有人需要,我可以分享代码。但逻辑确实很有用。感谢you@DataMan . . . 如果您有SQL Server问题,请提出新问题。方法会有很大不同,这个问题已经得到了回答。