3

我有看起来像这样但有更多索引名称和索引值的数据

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

我如何编写 SQL 查询以将所有日期的前一个日期的 indx_val 减去 indx_val。我想基本上找到每日回报。例如,ABQI它将是1571.93-1568.55作为日期的回报2012-08-13等等。我希望结果有一dt列、indx_nm一列和dly_rtn一列。谢谢!

4

2 回答 2

4

尝试以下操作:

;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

另外,如果查询应该非常频繁地运行,我建议使用索引:

create unique index IX_TableName_1
    on TableName (indx_nm, dt desc) include (indx_val)
于 2013-08-15T20:35:16.280 回答
0
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  
于 2013-08-15T20:31:09.040 回答