Eu tenho a tarefa de encontrar valores inteiros de acordo com o último (max) do valor do timestamp (datetime).
Por ser uma consulta tão complicada, estou considerando esta maneira de encontrar o último valor algo assim
Pseudo-código:
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
A ideia é fazer uma subconsulta ordenada por timestamp e depois atualizar a tabela.
Nesse caso, em algum momento haverá mais valores na subconsulta para um pk_val (valor da chave primária).
Para mim agora parece que é impossível e estou pensando em fazer atualizações no CURSOR. Mas antes de continuar, adoraria ouvir você escolher isso.
A pergunta mais limpa seria: como as atualizações funcionam quando em uma transação (selecionar) o SQL precisa atualizar a mesma linha duas vezes?
* EDIT:1 * Aqui está uma amostra com dados
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
Sua pergunta não está clara. Você está tentando atualizar o valor de alguma tabela baseado em um valor de outra? Isso pode ser resolvido usando algo como a consulta abaixo:
No SQL Server 2005 ou mais recente: