在SQL Server中,我有4列的表
artid num A B
46 1 417636000 0
47 1 15024000 0
102 1 3418105650 0
226 1 1160601286 0
60 668 260000 0
69 668 5500000 0
我想在结果集中为某些计算创建新列
此列应具有如下值:
artid num a b newColumnValue
----------- ----------- ---------------------- ---------------------- ----------------------
46 1 417636000 0 a-b+previous newColumnValue
我写了这个查询,但我无法获得previous newColumnValue
:
select *, (a- b+ lag(a- b, 1, a- b) over (order by num,artid)) as newColumnValue
FROM MainTbl
ORDER BY num,artid
我得到了这个结果
artid num a b newColumnValue
----------- ----------- ---------------------- ---------------------- ----------------------
46 1 417636000 0 417636000
47 1 15024000 0 432660000
102 1 3418105650 0 3433129650
226 1 1160601286 0 4578706936
60 668 260000 0 1160861286
69 668 5500000 0 5760000
我想得到这个结果
artid num a b newColumnValue
----------- ----------- ---------------------- ---------------------- ----------------------
46 1 417636000 0 417636000
47 1 15024000 0 432660000
102 1 3418105650 0 3850765650
226 1 1160601286 0 5011366936
60 668 260000 0 5011626936
69 668 5500000 0 5017126936
答案 0 :(得分:0)
鉴于以下示例数据,
+----+---+---+
| Id | A | B |
+----+---+---+
| 1 | 2 | 3 |
+----+---+---+
| 2 | 3 | 4 |
+----+---+---+
| 3 | 4 | 5 |
+----+---+---+
| 4 | 5 | 6 |
+----+---+---+
| 5 | 6 | 7 |
+----+---+---+
以下短SQL语句产生所需的输出:
select A - B + lag(A - B, 1, 0) over (order by id)
from test
+----+
| -1 |
+----+
| -2 |
+----+
| -2 |
+----+
| -2 |
+----+
| -2 |
+----+
请注意,Lag function有三个参数:第一个是您要为"滞后"评估的表达式。记录,第二个是滞后量(默认为1),第三个是无法计算表达式时返回的值(例如,如果它是第一个记录)。
答案 1 :(得分:0)
你想要累积总和(好吧,它们之间的差异):
select a, b, sum(a - b) over (order by num, artid)
from mytbl;
注意:SQL表代表无序集。您需要一列来指定定义上一个的顺序。如果您真的只有两列,那么我可能会认为排序基于a
,查询将是:
select a, b, sum(a - b) over (order by a)
from mytbl;