我有一个表记录了一个刻度(重量)的浮点值。我想动态地评估该曲线的积分的绝对值。我试图基于梯形近似执行一些简单的代数。采样率(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
任何引用前一个减法值的想法?
答案 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