我正在努力研究一种我似乎无法想出办法的逻辑。 的问题: 我有三列PrimaryKey,COl1和COl2,如下面的截图
所示我们来一个新列Col3 = Col1-Col2,
我将Col3中的剩余部分添加到下一行的Col1中,然后再次将其减去Col3。
让我们考虑上面的表格和
PrimaryKey = 1 - > Col3 = 10.2 - 5 = 5.2。
必须将此5.2添加到PrimaryKey = 2的Col1中 15 + 5.2 = 20.2。
现在再次Col3 = 20.2 - 3 = 17.2,像这样它必须迭代下一个记录。
我希望我能够清楚地解释我的问题。如果您需要任何进一步的解释,请告诉我。
*提供的表只是一个示例表,我工作的实际表非常大。
谢谢。
答案 0 :(得分:1)
据我所知,你想要从col1的累积中减去col2的累积值。在SQL Server 2012+中,您可以这样做:
select t.*,
sum(col2 - col1) over (order by primary key)
from t;
答案 1 :(得分:0)
您可以在原始表格上使用自我加入,但如果主要密钥未完成,则存在危险,例如在某些时候删除记录。在这里,我使用ROW_NUMBER的自连接来创建一个绝对顺序的密钥 - 这允许我将[此行号]加入[此行号+ 1](如果其他人有更好的方法,则包含示例数据):
DECLARE @YourTable TABLE (PrimaryKey INT IDENTITY(1,1), COL1 FLOAT, COL2 FLOAT)
INSERT INTO @YourTable
( COL1, COL2 )
VALUES
(10.2, 5.0)
, (15.0, 3.0)
, (5.7, 6)
, (9.0, 5.5)
; WITH TableRanked
AS (
SELECT PrimaryKey ,
COL1 ,
COL2
, COL3 = COL1 - COL2
, RowNum = ROW_NUMBER() OVER(ORDER BY PrimaryKey)
FROM @YourTable
)
SELECT tr.PrimaryKey ,
tr.COL1 ,
tr.COL2 ,
tr.COL3
, COL1Next = COALESCE(trNext.COL1, 0)
, COL4 = tr.COL3 + COALESCE(trNext.COL1, 0)
FROM TableRanked tr
LEFT JOIN TableRanked trNext
-- Here's where the magic happens:
ON trNext.RowNum = (tr.RowNum + 1)
答案 2 :(得分:0)
如果您使用的是SQL Server 2012,则可以使用LEAD。这将获得与Russel发布但具有更好性能的结果相同的结果:
DECLARE @YourTable TABLE (PrimaryKey INT IDENTITY(1,1), COL1 FLOAT, COL2 FLOAT)
INSERT INTO @YourTable (COL1, COL2 )
VALUES (10.2, 5.0), (15.0, 3.0), (5.7, 6), (9.0, 5.5);
SELECT *, (COL1 - COL2) + LEAD(COL1,1,0) OVER (ORDER BY PrimaryKey)
FROM @YourTable;
答案 3 :(得分:0)
如果此查询有帮助,请与我们联系:
DECLARE @n int
SELECT @n = count(*) from @yourTable
DECLARE @counter int
SELECT @counter = MIN(PrimaryKeyCol) from @yourTable
DECLARE @col3 = 0
WHILE (@counter <= @n)
SELECT @col3 = @col3 + Col1 - Col2 from @yourTable where PrimaryKeyCol = @counter
Print @col3
@counter = @counter + 1
END