【发布时间】:2017-06-07 19:39:04
【问题描述】:
我尝试执行以下计算
样本数据:
CREATE TABLE #Table1
(
rno int identity(1,1),
ccp varchar(50),
[col1] INT,
[col2] INT,
[col3] INT,
col4 as [col2]/100.0
);
INSERT INTO #Table1
(ccp,[col1],[col2],[col3])
VALUES ('ccp1',15,10,1100),
('ccp1',20,10,1210),
('ccp1',30,10,1331),
('ccp2',10,15,900),
('ccp2',15,15,1000),
('ccp2',20,15,1010)
+-----+------+------+------+------+----------+
| rno | ccp | col1 | col2 | col3 | col4 |
+-----+------+------+------+------+----------+
| 1 | ccp1 | 15 | 10 | 1100 | 0.100000 |
| 2 | ccp1 | 20 | 10 | 1210 | 0.100000 |
| 3 | ccp1 | 30 | 10 | 1331 | 0.100000 |
| 4 | ccp2 | 10 | 15 | 900 | 0.150000 |
| 5 | ccp2 | 15 | 15 | 1000 | 0.150000 |
| 6 | ccp2 | 20 | 15 | 1010 | 0.150000 |
+-----+------+------+------+------+----------+
注意:不仅仅是3记录每个ccp可以有Nno.of记录
预期结果:
1083.500000 --1100 - (15 * (1+0.100000))
1169.850000 --1210 - ((20 * (1+0.100000)) + (15 * (1+0.100000)* (1+0.100000)) )
1253.835000 --1331 - ((30 * (1+0.100000)) + (20 * (1+0.100000)* (1+0.100000)) + (15 * (1+0.100000)* (1+0.100000) *(1+0.100000)) )
888.500000 --900 - (10 * (1+0.150000))
969.525000 --1000 - ((15 * (1+0.150000)) + (10 * (1+0.150000)* (1+0.150000)) )
951.953750 --1010 - ((20 * (1+0.150000)) + (15 * (1+0.150000)* (1+0.150000)) + (10 * (1+0.150000)* (1+0.150000) *(1+0.150000)) )
我知道我们可以使用递归 CTE 来做到这一点,它效率不高,因为我必须对超过 500 万条记录执行此操作。
我希望实现类似这种基于集合的方法
对于 ccp:ccp1
SELECT col3 - ( col1 * ( 1 + col4 ) )
FROM #Table1
WHERE rno = 1
SELECT rno,
col3 - ( ( col1 * Power(( 1 + col4 ), 1) ) + ( Lag(col1, 1)
OVER(
ORDER BY rno ) * Power(( 1 + col4 ), 2) ) )
FROM #Table1
WHERE rno IN ( 1, 2 )
SELECT rno,
col3 - ( ( col1 * Power(( 1 + col4 ), 1) ) + ( Lag(col1, 1)
OVER(
ORDER BY rno ) * Power(( 1 + col4 ), 2) ) + ( Lag(col1, 2)
OVER(
ORDER BY rno ) * Power(( 1 + col4 ), 3) ) )
FROM #Table1
WHERE rno IN ( 1, 2, 3 )
有没有办法在单个查询中计算?
更新:
仍然愿意接受建议。我坚信应该有人使用SUM () Over(Order by) 窗口聚合函数来做到这一点。
【问题讨论】:
-
你有 500 万条记录,是否意味着在 Id 4 上,你将添加 id 3、2、1,在 Id 10 上,你将添加 9、8 ...、3、2、1 ?或者你继续连续 3 次?
-
@Veljko89 - 对于 id 4,我将添加 3,2,1。
-
@Veljko89 - 添加更多示例数据以清除事物
-
@Prdp .. 每个 ccp 的 col2 是否相同?
-
我怀疑你会找到任何使用
SUM () Over(Order by)的方法 - 所做的只是得到一个表达式的总和。不允许您操纵之前的运行总计,然后将结果用作新的运行总计。
标签: sql sql-server tsql sql-server-2012