J'ai des données qui ressemblent à ceci mais avec beaucoup plus de noms d'index et de valeurs d'index
dt indx_nm indx_val 2013-08-13 00:00:00.000 ABQI 1571.93 2013-08-12 00:00:00.000 ABQI 1568.55 2013-08-09 00:00:00.000 ABQI 1566.1 2013-08-08 00:00:00.000 ABQI 1573.98 2013-08-07 00:00:00.000 ABQI 1567.42 2013-08-06 00:00:00.000 ABQI 1579.49 2013-08-13 00:00:00.000 ACNACTR 280.3931 2013-08-12 00:00:00.000 ACNACTR 275.1943 2013-08-09 00:00:00.000 ACNACTR 268.8868 2013-08-08 00:00:00.000 ACNACTR 265.7915 2013-08-07 00:00:00.000 ACNACTR 264.8321 2013-08-13 00:00:00.000 ACNITTR 145.3845 2013-08-12 00:00:00.000 ACNITTR 144.1252 2013-08-09 00:00:00.000 ACNITTR 143.2331 2013-08-08 00:00:00.000 ACNITTR 141.4968 2013-08-07 00:00:00.000 ACNITTR 140.6079
Comment pourrais-je écrire une requête SQL afin de soustraire le indx_val par le indx_val de la date précédente pour toutes les dates. Je voudrais find des returns quotidiens essentiellement. Par exemple, pour ABQI
il y aurait 1571.93
– 1568.55
comme déclaration pour la date du 2012-08-13
et ainsi de suite. Je voudrais que le résultat ait une colonne dt
, indx_nm
colonne dly_rtn
et dly_rtn
colonne dly_rtn
. Je vous remercie!
Essayez de suivre:
;with cte as ( select dt, indx_nm, indx_val, rn = row_number() over (partition by indx_nm order by dt desc) from TableName ) select c1.dt, c1.indx_nm, c1.indx_val - c2.indx_val as dly_rtn from cte c1 left join cte c2 on c2.rn = c1.rn + 1 and c2.indx_nm = c1.indx_nm order by c1.indx_nm, c1.dt desc
Aussi, si la requête est supposée être exécutée assez fréquemment, je reorderais d'avoir index:
create unique index IX_TableName_1 on TableName (indx_nm, dt desc) include (indx_val)
select a.dt,a.indx_nm ,(b.indx_val-a.indx_val)dly_rtn From table1 a join Table1 b on a.dt=dateadd(dd,1,b.dt) and a.indx_nm=b.indx_nm