【问题标题】:Get most recent state from series of transactions从一系列交易中获取最新状态
【发布时间】:2018-07-20 14:38:29
【问题描述】:

我在这里在黑暗中寻找。我什至不确定我的想法是否真的存在。

我有一个基于事务的数据库,其中包含对记录的一系列更新。每行包含对一个或多个列的更新。有没有办法获得整个记录的最终状态。例如:

+-----------+---------+---------+--------+---------+
| update_id | country | status  | amount | device  |
+-----------+---------+---------+--------+---------+
|         1 | UK      | valid   |    100 | iPhone  |
|         2 |         | invalid |        |         |
|         3 |         |         |    200 | Android |
|         4 | DE      |         |    300 |         |
|         5 |         | valid   |        | Android |
|         6 |         |         |     50 |         |
|         7 | FR      |         |    350 |         |
|         8 |         |         |        | iPhone  |
+-----------+---------+---------+--------+---------+

这里的最终状态是:

FR | valid | 350 | iPhone

有没有一种方法可以在一个查询或其他方法中获得(但对于数百万条唯一记录和数百列)?

目前我能想到的唯一方法是使用游标并更新最终状态表,但这需要很长时间。

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?
  • SQL Server 2016,但可以升级到 2017。

标签: sql-server tsql sql-server-2016


【解决方案1】:

您可以使用子查询,但您必须为每一列编写一个子查询:

declare @tmp table (update_id int, 
     country varchar(2), 
     status varchar(10), 
     amount int, 
     device varchar(20))

insert into @tmp values
 (1 , 'UK'    , 'valid'   ,    100 , 'iPhone' )
,(2 , null    , 'invalid' ,   null ,  null    )
,(3 , null    , null      ,    200 , 'Android')
,(4 , 'DE'    , null      ,    300 , null     )
,(5 , null    , 'valid'   ,   null , 'Android')
,(6 , null    , null      ,     50 , null     )
,(7 , 'FR'    , null      ,    350 , null     )
,(8 , null    , null      ,   null , 'iPhone' )

select 
(select top 1  country from @tmp where country is not null order by update_id desc) as country,
(select top 1  status  from @tmp where status  is not null order by update_id desc) as status,
(select top 1  amount  from @tmp where amount  is not null order by update_id desc) as amount,
(select top 1  device  from @tmp where device  is not null order by update_id desc) as device

结果:

否则,您可以使用 SQL Server 元数据中的所有列生成动态 TSQL 语句。

【讨论】:

  • 谢谢你的作品。是否有代码可以执行相同的操作,但按另一列(例如 account_id)分组。然后我会得到每个帐户的最终状态...
猜你喜欢
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多