sql - 按先前组减去先前值 - SQL Server

标签 sql sql-server sql-server-2008

这个问题之前已经问过,并且专门针对 MySQL 得到了很好的回答,但是我非常感谢你们帮助将这个问题翻译成 SQL Server。之前的帖子已关闭,我不想重新打开它们,因为它们已经很旧了。

下面是要查询的数据集,以及查询解决方案所需的输出。下面是此处发布的优秀 MySql 解决方案 (SQL best way to subtract a value of the previous row in the query?)。我的问题是如何使用 SQL Server 中的变量实现相同的结果。如果这是一个新手问题,我深表歉意,但我是 SQL Server 中变量的新手,并且我尝试根据有关 SQL Server 中变量的 MSDN 文档转换为 SQL Server 失败。

感谢您的帮助!

select
      EL.SN,
      EL.Date,
      EL.EL.Value,
      if( @lastSN = EL.SN, EL.Value - @lastValue, 0000.00 ) as Consumption,
      @lastSN := EL.SN,
      @lastValue := EL.Value
   from
      EnergyLog EL,
      ( select @lastSN := 0,
               @lastValue := 0 ) SQLVars
   order by
      EL.SN,
      EL.Date

我需要通过 SN 号获得基于前一个的消费值。 这是我的数据:

表能源日志

SN     Date                 Value
2380   2012-10-30 00:15:51  21.01
2380   2012-10-31 00:31:03  22.04
2380   2012-11-01 00:16:02  22.65
2380   2012-11-02 00:15:32  23.11
20100  2012-10-30 00:15:38  35.21
20100  2012-10-31 00:15:48  37.07
20100  2012-11-01 00:15:49  38.17
20100  2012-11-02 00:15:19  38.97
20103  2012-10-30 10:27:34  57.98
20103  2012-10-31 12:24:42  60.83

这是我需要的结果:

SN      Date                 Value  consumption
2380    2012-10-30 00:15:51  21.01  0
2380    2012-10-31 00:31:03  22.04  1.03
2380    2012-11-01 00:16:02  22.65  0.61
2380    2012-11-02 00:15:32  23.11  0.46
20100   2012-10-30 00:15:38  35.21  0
20100   2012-10-31 00:15:48  37.07  1.86
20100   2012-11-01 00:15:49  38.17  1.1
20100   2012-11-02 00:15:19  38.97  0.8
20103   2012-10-30 10:27:34  57.98  0
20103   2012-10-31 12:24:42  60.83  2.85

最佳答案

通过使用 CTE,您将能够获取排序的数据,然后选择上一条记录。

WITH PREVCTE AS (
SELECT  *, 
        ROW_NUMBER() OVER (PARTITION BY SN ORDER BY MyDate) [RowNum] 
FROM @myTable
)
SELECT A.SN, 
       A.MyDate, 
       A.[Value], 
       A.[Value] - COALESCE(B.[Value], A.[Value]) [Consumption]
FROM PREVCTE A LEFT OUTER JOIN PREVCTE B 
    ON   A.RowNum - 1 = B.RowNum AND  
         A.SN = B.SN 

SQL Fiddle Demo

关于sql - 按先前组减去先前值 - SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34680181/

相关文章:

php - mysqli_multi_query 没有在 while 循环中多次执行

sql-server - SQL Server 重写左连接

SQL 存储过程 if 语句带位

java - 使用 JDBC 将用户定义的表类型传递给 SQL Server 存储过程

sql-server - SQL Server 中的自动文件组迁移

mysql - 在mysql中添加外键

projects-and-solutions - 如何将自定义文件夹添加到 Sql Server Management Studio 2008 解决方案?

c# - SCOPE_IDENTITY 在 asp.net 中不起作用?

PHP 是否可以在 while 循环中为每个 POST 表单发送唯一的值?

php - 我如何在mysql中查询两个不同的表