sql - 根据日期减值 SQL

标签 sql sql-server sql-server-2008

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

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 列。谢谢!

最佳答案

尝试以下操作:

;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)

关于sql - 根据日期减值 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18261148/

相关文章:

sql - 更新和插入 SQL

sql - Oracle 修剪字符串内部的空格

c# - 如何使用 ADO.NET 实现嵌套 SQL 事务?

sql-server - ADODB 连接无法连接到 sql server Express

sql - 如何在sql中使用一个公共(public)列以不同的条件两次使用同一列

sql-server - 为什么全文索引选项呈灰色?

sql-server - 在 SQL Server 2008 中将新索引部署到非常大的表的最佳方法

php - 如何将用户输入从 HTML 文本表单发送到 mySQL 数据库?

mysql - 为现有列设置非空属性

mysql - 如何优化多个连接