我需要计算表格两行之间的列的差异.有什么方法可以直接在SQL中执行此操作吗?我正在使用Microsoft SQL Server 2008.
我正在寻找这样的东西:
SELECT value - (previous.value) FROM table
想象一下"previous"变量引用了最新选择的行.当然,对于类似的选择,我最终将在具有n行的表中选择n-1行,这不是可能的,实际上正是我需要的.
这有可能吗?
使用滞后函数:
SELECT value - lag(value) OVER (ORDER BY Id) FROM table
用于Ids的序列可以跳过值,因此Id-1并不总是有效.
SQL没有内置的顺序概念,因此您需要按某些列排序才能使其有意义.像这样的东西:
select t1.value - t2.value from table t1, table t2 where t1.primaryKey = t2.primaryKey - 1
如果您知道如何订购但不知道如何获得当前的值(EG,您希望按字母顺序排序),那么我不知道在标准SQL中如何做到这一点,但是大多数SQL实现都会有这样做的扩展.
如果您可以对每个行进行排序以使每个行都不同,那么这是一种适用于SQL服务器的方法:
select rank() OVER (ORDER BY id) as 'Rank', value into temp1 from t select t1.value - t2.value from temp1 t1, temp1 t2 where t1.Rank = t2.Rank - 1 drop table temp1
如果需要断开关系,可以根据需要向ORDER BY添加任意数量的列.
WITH CTE AS ( SELECT rownum = ROW_NUMBER() OVER (ORDER BY columns_to_order_by), value FROM table ) SELECT curr.value - prev.value FROM CTE cur INNER JOIN CTE prev on prev.rownum = cur.rownum - 1
Oracle,PostgreSQL,SQL Server和更多RDBMS引擎都具有调用的分析函数,LAG
并且LEAD
可以执行此操作.
在2012年之前的SQL Server中,您需要执行以下操作:
SELECT value - ( SELECT TOP 1 value FROM mytable m2 WHERE m2.col1 < m1.col1 OR (m2.col1 = m1.col1 AND m2.pk < m1.pk) ORDER BY col1, pk ) FROM mytable m1 ORDER BY col1, pk
,COL1
您所订购的列在哪里.
索引(COL1, PK)
将大大改善此查询.
LEFT将表连接到自身,连接条件计算出来,因此在表的连接版本中匹配的行是前一行,对于"previous"的特定定义.
更新:起初我以为你想要保留所有行,对于没有前一行的条件使用NULL.再次阅读它只是想要剔除行,所以你应该是一个内连接而不是一个左连接.
更新:
较新版本的Sql Server也具有可用于此的LAG和LEAD窗口功能.