【问题标题】:SQL Calculate Difference Between Current and Last Value By Timestamp ColumnSQL通过时间戳列计算当前值和上一个值之间的差异
【发布时间】:2013-02-21 10:11:39
【问题描述】:

我要计算时间戳列组织的当前值和上一个值之间的差异?

我的表组织如下:

MeterID(PK,FK,int.not null), ActualTimeStamp(smalldatetime,not null), Value(float,null)

Meter ID     ActualTimeStamp     Value          
312514     2013-01-01 08:08:00   72         
312514     2013-01-01 08:07:00   12 

所以我的答案应该是72 - 12 = 60

我似乎能找到的唯一解决方案是使用我无法选择的行号,如果有人可以帮助我,我真的很感激它破坏了我的大脑。

【问题讨论】:

  • 您使用的是哪个 RDBMS(例如 MySQL、SQL-Server、PostgreSQL)
  • 为什么不能使用行号?
  • 我认为我必须有一个行号列来组织?我的查询将是通过仪表 id 计算当前值和上一个值之间的差异的单个查询。我正在查看的一个选项是: SELECT [current].rowInt, [current].Value, ISNULL([next].Value, 0) - [current].Value FROM sourceTable AS [current] LEFT JOIN sourceTable AS [next] ON [next].rowInt = (SELECT MIN(rowInt) FROM sourceTable WHERE rowInt > [current].rowInt)
  • 但我无法让它工作,抱歉我的 SQL 非常基础。
  • 您能否提供更多有关您预期输出的信息,例如 Meter ID 312514 有 3 条记录?您想以另一列的形式获得答案吗?

标签: sql sql-server sql-server-2008 datediff


【解决方案1】:

这是一个可以帮助您的查询。只需修改它以适合您的需要/表名称/等。

with sub as (
  select meterid,
         actualtimestamp,
         value,
         row_number() over (partition by meterid order by actualtimestamp desc) as rn
     from test  
  )
select meterid,
       actualtimestamp,
       value,
       value - isnull((select value
                 from sub
                where s.meterid = meterid
                  and rn = s.rn + 1), value) as answer
from sub s
order by meterid, actualtimestamp desc;

基本上它的作用是使用 row_number() 聚合函数添加行号。使用行号,查询尝试从上一个条目中获取值并获取值差异。

试试fiddler here

【讨论】:

  • 感谢劳埃德,这正是我要找的。 :)
  • 嗨 Lloyd,我的查询在 SQL 中运行良好,当我将它放入应用程序时,我使用它失败了,在进一步调查日志后它说:[Microsoft][ODBC SQL Server Driver]关键字“by”附近的语法不正确。是否有可以用于 ODBC Sql 请求的变体?
  • 这是我的确切查询:sub as (select meterid,actualtimestamp,value,row_number() over (partition bymeterid order by actualtimestamp desc) as rn from esight.dbo.MeterData where ActualTimeStamp >= DATEADD(dd,DATEDIFF(dd,0,getdate()), 0) 和 MeterID = '31574') 选择值 - isnull((从 s.meterid = Meterid 和 rn = s.rn + 1 的 sub 中选择值), value) 作为 answer,0 from sub sorder by meterid, actualtimestamp desc;
  • 错误在应用程序内,因此很难导出,让我为您获取。
  • from sub sorder 确保别名“s”和订单之间有一个空格。
【解决方案2】:

在 SQL Server 2008 中,我会推荐 outer applyhere 根据您的要求查找差异的短代码

    select t.*, isnull((t.value - tprev.value),0) as diff
from test t outer apply
     (select top 1 tprev.*
      from test tprev
      where tprev.meterid = t.meterid and
            tprev.actualtimestamp < t.actualtimestamp
      order by tprev.actualtimestamp desc
       )tprev

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多