MS SQL Server代数语法

时间:2014-10-16 20:57:56

标签: sql-server

我有一个表记录了一个刻度(重量)的浮点值。我想动态地评估该曲线的积分的绝对值。我试图基于梯形近似执行一些简单的代数。采样率(b-a = 1)为1:

(b-a)((f(a)+f(b))/2 - f(a))

值f(a)和f(b)表示在我的SQL Server表中记录的2个最新值。我尝试了以下评估错误:

 SELECT TOP 2 
     SUM(Scale_Weight) OVER(ORDER BY t_stamp DESC)/2.0
 FROM table

此查询计算,但只是将最近的值除以2:

SELECT 
    SUM(Scale_Weight) OVER(ORDER BY t_stamp DESC)/2.0
FROM table

如您所见,我甚至没有尝试绝对值或减去“第二个最近”值,因为我不知道如何引用特定行(单元格?)。作为一个菜鸟,我觉得数学在单个查询中是可行的,我只是找不到合适的语法。提前谢谢。

所以要更清楚地更新:

感谢输入ps2goat,虽然由于某种原因我无法实现“TOP”功能,所以我目前有这个:

SELECT ABS(SUM(Scale_Weight) OVER(PARTITION BY quality_code
    ORDER BY t_stamp
    ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)/2.0)
FROM table

仍然需要减去前面的值,例如:

SELECT ABS(SUM(Scale_Weight) OVER(PARTITION BY quality_code
    ORDER BY t_stamp
    ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)/2.0
    - 1 PRECEDING)
FROM table

任何引用前一个减法值的想法?

2 个答案:

答案 0 :(得分:1)

您可以使用LAG函数按特定顺序引用最后一个值。例如:

SELECT Scale_Weight AS Current, LAG(Scale_Weight) AS Last OVER (ORDER BY t_stamp)
FROM table

您可以在此查询中添加公式。

答案 1 :(得分:0)

这就是我所做的。而不是时间戳,我使用了一个Identity字段,因为它们会递增并且更容易手动输入(不确定您是否有日期时间值或实际时间戳值)

小提琴:http://sqlfiddle.com/#!6/77bcb/4/0

模式:

create table x(
  xId int identity(1,1) not null primary key,
  scale_weight decimal(12,4)
  );

insert into x(scale_weight)
 select 24.1234 union all
 select 32.4455 union all
 select 88.1234 union all
 select 223.443;

内部查询(下方)抓取前两行,按ID降序排序(使用您的t_stamp列)。外部查询将内部查询返回的所有Scale_Weight值相加,并将该值除以2。

SQL:

select SUM(Scale_Weight)/2.0 from
(
  SELECT TOP 2 Scale_Weight      
   FROM x
    ORDER BY xid DESC
  ) y