Gracias de antemano.

Tengo un table1 y table2

tabla1

id   ||  date        || name_id   ||   value   
001  || 2017-12-01   || 212       || 23.091
002  || 2017-12-02   || 212       || 20.324
003  || 2017-12-03   || 212       || 21.765
004  || 2017-12-04   || 212       || 25.890
005  || 2017-12-01   || 497       || 23.291
006  || 2017-12-02   || 497       || 20.524
007  || 2017-12-03   || 497       || 21.705
008  || 2017-12-04   || 497       || 25.810
009  || 2017-11-01   || 242       || 23.492
010  || 2017-11-02   || 242       || 20.744
011  || 2017-11-03   || 242       || 21.076
012  || 2017-11-04   || 242       || 24.100
013  || 2017-10-01   || 197       || 23.376
014  || 2017-10-02   || 197       || 20.555
015  || 2017-10-03   || 197       || 21.965
016  || 2017-10-04   || 197       || 25.120

tabla2

id   ||  startup_date  || Name  
212  || 2017-11-31     || BVUNMI
497  || 2017-11-30     || OUKNGT
242  || 2017-10-26     || TYNBFD
197  || 2017-09-28     || WDRHBG

Salida

id   ||  startup_date  || Name      ||   Avg_value
212  || 2017-11-31     || BVUNMI    ||   22.7675
497  || 2017-11-30     || OUKNGT    ||   23.291
242  || 2017-10-26     || TYNBFD    ||   22.353
197  || 2017-09-28     || WDRHBG    ||   22.754

Esto es solo una muestra de datos. Tengo miles de registros y no puedo entender cómo hacerlo.

La lógica es que necesito calcular el valor promedio de los primeros 30 días desde la fecha de inicio. Tengo que tomar el valor promedio de cada NAME_ID y crear, actualizar en una nueva columna en la tabla 2.

Estoy atascada y no sé cómo ir más allá.

Cualquier ayuda es apreciada.

0
Looking_for_answers 23 ene. 2018 a las 12:37

3 respuestas

La mejor respuesta

31/11/2017 - no existe

Así que lo cambié a 2017-11-30, por eso mi resultado es ligeramente diferente al tuyo. desafortunadamente, tal consulta puede dar un mal rendimiento en grandes volúmenes de datos. Sugeriría desnormalizar un poco los datos si es posible (agregue start_date en t1)

SET DATEFORMAT dmy
declare @t1 table(id int , dt date, name_id int, value decimal(15,2))
declare @t2 table(id int , startup_date date, Name nvarchar(100))
insert into @t1(id,dt,name_id,value)
values
(001,convert(date,'2017-12-01',121),212    ,23.091),
(002,convert(date,'2017-12-02',121),212    ,20.324),
(003,convert(date,'2017-12-03',121),212    ,21.765),
(004,convert(date,'2017-12-04',121),212    ,25.890),
(005,convert(date,'2017-12-01',121),497    ,23.291),
(006,convert(date,'2017-12-02',121),497    ,20.524),
(007,convert(date,'2017-12-03',121),497    ,21.705),
(008,convert(date,'2017-12-04',121),497    ,25.810),
(009,convert(date,'2017-11-01',121),242    ,23.492),
(010,convert(date,'2017-11-02',121),242    ,20.744),
(011,convert(date,'2017-11-03',121),242    ,21.076),
(012,convert(date,'2017-11-04',121),242    ,24.100),
(013,convert(date,'2017-10-01',121),197    ,23.376),
(014,convert(date,'2017-10-02',121),197    ,20.555),
(015,convert(date,'2017-10-03',121),197    ,21.965),
(016,convert(date,'2017-10-04',121),197    ,25.120)

insert into @t2(id,startup_date,Name)
VALUES 
(212,convert(date,'2017-11-30',121),'BVUNMI'),
(497,convert(date,'2017-11-30',121),'OUKNGT'),
(242,convert(date,'2017-10-26',121),'TYNBFD'),
(197,convert(date,'2017-09-28',121),'WDRHBG')

select
avg(value)
from @t2 t2
inner join @t1 t1 on t2.id = t1.name_id and t1.dt < dateadd(d,30,t2.startup_date)
group by t1.name_id
2
Vladimir Semashkin 23 ene. 2018 a las 11:30

Utilice la subconsulta y dateadd

 select id,
        startup_date,
        Name,
        (
           select avg(value)
           from table1 t1
           where t1.name_id = t2.id and
                 date between t2.startup_date and dateadd(day, 30, t2.startup_date)
        ) Avg_value
 from table2 t2

O JOIN con GROUP BY

 select t2.id,
        t2.startup_date,
        t2.Name,
        avg(value) Avg_value
 from table2 t2
 join table1 t1 on t1.name_id = t2.id and
                   t1.date between t2.startup_date and dateadd(day, 30, t2.startup_date)
 group by t2.id,
          t2.startup_date,
          t2.Name
3
Radim Bača 23 ene. 2018 a las 09:42

Prueba esto:

select [t2].[Name], AVG([t1].[value]) from [table1] [t1] join [table2] [t2]
on [t1].[name_id] = [t2].[id] and [t1].[date] between [t2].[startup_date] and 
DATEADD(day, 30, [t2].[startup_date])
group by [t2].[Name]
1
Michał Turczyn 23 ene. 2018 a las 09:47
48398399