使用sql在列中减去两个值

时间:2016-01-31 06:45:12

标签: mysql sql-server-2008-r2 oracle10g

我想使用SQL查询显示两个不同行的两个值的减法。

这是表结构:

id | Value|
-----------
1  | 20 | 
2  | 30 | 
3  | 50 |
4  | 70 |
5  | 100 |

输出应如下所示。

id | Value| Difference |
------------------------
1  | 20 | Null |
2  | 30 | 10 |
3  | 50 | 20 |
4  | 70 | 20 |
5  | 100 | 30 |

3 个答案:

答案 0 :(得分:0)

我有SQL Server的解决方案,我希望Oracle和MySQL的解决方案非常相似。

注意: Id s不必是连续的,但我用它们来订购结果。

<强>设定:

-- drop table dbo.testVals
CREATE TABLE dbo.testVals (
    Id INT,
    Value INT
)
GO

-- truncate table dbo.testVals 
INSERT INTO dbo.testVals (Id, Value)
VALUES (1, 20),  (2, 30),  (3, 50), (4, 70), (5, 100)
GO

SQL Server 2008 R2解决方案:

;WITH cte as (
    SELECT Id, Value, ROW_NUMBER() OVER (ORDER BY Id) AS RowNo
    FROM dbo.testVals
)
SELECT r1.Id, r1.Value, r1.Value - r2.Value 
FROM cte r1 
    LEFT JOIN cte r2 ON r2.RowNo = r1.RowNo - 1
GO

SQL Server 2012解决方案:(我们在那里有LAG和LEAD功能)

SELECT Id, Value, Value - LAG(Value, 1, NULL) OVER (ORDER BY Id)
FROM dbo.testVals
GO

Oracle具有LAG和LEAD功能。 MySQL确实not seem to have,所以你应该使用与第一个查询类似的东西。

答案 1 :(得分:0)

试试这个:

SELECT t1.id, t1.value,
CASE t2.value WHEN NULL THEN NULL ELSE (t1.value - t2.value) END AS Difference
FROM mytable t1 LEFT JOIN mytable t2 ON t1.id = (t2.id + 1) ORDER BY t1.id

请参阅sqlfiddle

答案 2 :(得分:0)

另一种方法

SELECT id, VALUE, (VALUE - previousValue) AS difference  FROM (
SELECT id, VALUE, @prevValue previousValue , @prevValue := `VALUE` FROM `mytable`
JOIN (SELECT @prevValue := NULL) a
ORDER BY id ) b;

请参阅Fiddle