Edw*_*vis 81 sql sql-server sql-server-2008
我需要计算表格两行之间的列的差异.有什么方法可以直接在SQL中执行此操作吗?我正在使用Microsoft SQL Server 2008.
我正在寻找这样的东西:
SELECT value - (previous.value) FROM table
Run Code Online (Sandbox Code Playgroud)
想象一下"previous"变量引用了最新选择的行.当然,对于类似的选择,我最终将在具有n行的表中选择n-1行,这不是可能的,实际上正是我需要的.
这有可能吗?
Han*_*zel 55
使用滞后函数:
SELECT value - lag(value) OVER (ORDER BY Id) FROM table
Run Code Online (Sandbox Code Playgroud)
用于Ids的序列可以跳过值,因此Id-1并不总是有效.
Ros*_*ant 54
SQL没有内置的顺序概念,因此您需要按某些列排序才能使其有意义.像这样的东西:
select t1.value - t2.value from table t1, table t2
where t1.primaryKey = t2.primaryKey - 1
Run Code Online (Sandbox Code Playgroud)
如果您知道如何订购但不知道如何获得当前的值(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
Run Code Online (Sandbox Code Playgroud)
如果需要断开关系,可以根据需要向ORDER BY添加任意数量的列.
Jer*_*ein 27
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
Run Code Online (Sandbox Code Playgroud)
Qua*_*noi 26
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
Run Code Online (Sandbox Code Playgroud)
,COL1您所订购的列在哪里.
索引(COL1, PK)将大大改善此查询.
LEFT将表连接到自身,连接条件计算出来,因此在表的连接版本中匹配的行是前一行,对于"previous"的特定定义.
更新:起初我以为你想要保留所有行,对于没有前一行的条件使用NULL.再次阅读它只是想要剔除行,所以你应该是一个内连接而不是一个左连接.
更新:
较新版本的Sql Server也具有可用于此的LAG和LEAD窗口功能.
| 归档时间: |
|
| 查看次数: |
276936 次 |
| 最近记录: |