Trouver la dernière valeur (max) selon la TimeStamp en utilisant la méthode de mise à jour
-
22-10-2019 - |
Question
Je tâche de trouver des valeurs de nombre entier suivant dernier (max) de la valeur d'horodatage (datetime).
Parce qu'il est si compliqué requête je consindering cette façon de trouver la dernière valeur quelque chose comme ceci
Pseudo-code:
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
L'idée est de faire sous-requête qui est ordonnée par horodatage et à la table de mise à jour.
Dans ce cas, quelque temps va être plus dans les valeurs sous-requête pour une pk_val (valeur primary_key).
Pour moi, ressemble maintenant qu'il est impossible et j'envisage de faire des mises à jour à CURSOR. Mais avant que je parte, j'aimerais vous entendre ce choix.
question Cleaner serait la suivante: comment les mises à jour de travail lorsque dans une seule transaction (choisir) Besoin de SQL pour mettre à jour deux fois même ligne
* EDIT: 1 * Voici l'échantillon avec des données
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
La solution
Votre question est pas claire. Vous essayez de mettre à jour la valeur d'une table basée sur une valeur d'un autre? Ceci peut être résolu en utilisant quelque chose comme la requête suivante:
Dans SQL Server 2005 ou plus récent:
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