Sql-Server

使用更新方法根據時間戳查找最後一個(最大值)值

  • May 9, 2012

我的任務是根據時間戳(日期時間)值的最後一個(最大值)查找整數值。

因為它是如此復雜的查詢,所以我正在考慮這種方式來找到類似這樣的最後一個值

虛擬碼:

update my_table
   set value=last_value
from my_table 
   inner join (
                select *
                   from (
                   select top(100) percent
                       from 
                           ( select ts,last_value,pk_v from tb1
                                   union all
                             select ts,last_value,pk_v from tb2
                             ..
                             ) as temp
                             order by ts 
                             ) as temp_order
                           ) as temp on my_table.pk_v=temp.pk_v

這個想法是製作按時間戳排序的子查詢,然後更新表。

在這種情況下,有時會在子查詢中為一個 pk_val(primary_key 值)提供更多值。

對我來說,現在看起來這是不可能的,我正在考慮在 CURSOR 中進行更新。但在我繼續之前,我很想听聽你選擇這個。

更清晰的問題是:在一個事務(選擇)SQL 中更新如何工作需要兩次更新同一行?

**編輯:1 ** 這是帶有數據的範例

create table #Table_To_update
(pk int not null,last_value int)

insert into #Table_To_update
select 1,null
union all
select 2,null
union all
select 3,null

create table #table_as_sub_query
(fk int, value int ,ts datetime)


insert into #table_as_sub_query
select 1,5,'2012-01-01'
union all 
select 1,6,'2012-03-01'
union all 
select 1,2,'2012-04-01'
union all
select 2,7,'2012-02-01'
union all 
select 2,8,'2012-02-05'
union all 
select 2,6,'2012-04-01'
union all
select 3,0,'2012-01-01'
union all 
select 3,9,'2012-05-05'
union all 
select 3,12,'2012-01-01'



/*--This Way I want to update new table with last values --*/
update #Table_To_update
set last_value=table2.value
from #Table_To_update table1
inner join (select 
               top(100) percent
               *
           from #table_as_sub_query
               order by ts desc
               ) as table2 on table1.pk=table2.fk

你的問題不清楚。您正在嘗試根據另一個表的值更新某個表的值?這可以使用以下查詢來解決:

在 SQL Server 2005 或更高版本中:

with my_data_cte (
 select row_number() over (order by timestamp desc) as sequence,
 pk_vv
from (
 select timestamp, pk_v from tb1
 union all
 select timestamp, pk_v from tb2
)
)
update my_table
set value = pk_v
from my_table mt
 inner join my_data_cte ct on mt.pk_v = mt.pk_v
where sequence = 1

引用自:https://dba.stackexchange.com/questions/17590