在为每一行执行操作时选择行,前一个作为参数

时间:2014-03-26 17:32:02

标签: sql db2 relational-database db2-luw

假设我有一张类似于:

的表格
+-------+
| FIELD |
+-------+
| 1000  |
| 1200  |
| 1300  |
| 900   |
| 1400  |
+-------+

如何执行SELECT查询以检索行0..N,但不是获取它们的值,而是获得每行前一行的算术差异,i。即RESULT(N) = ROW(N) - ROW(N-1)?我希望得到类似的东西:

+--------------+
| RESULT       |
+--------------+
| (EMPTY OR 0) |
| 200          |
| 100          |
| -400         |
| 500          |
+--------------+

我正在使用DB2。如果您向我提供一些不特定于特定SQL DBMS的可移植响应,那将会非常酷。

提前致谢!

1 个答案:

答案 0 :(得分:2)

您需要的是LAG功能。它存在于多个数据库中,包括

语法将是这样的

SELECT CASE WHEN LAG(MyField, 1) OVER ( PARTITION BY MyID ORDER BY SomeThing ) IS NULL THEN 0
            ELSE MyField - LAG(MyField, 1) OVER ( PARTITION BY MyID ORDER BY SomeThing )
       END AS Result
    FROM MyTable

Documentation on LAG from IBM