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
Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top