原文:https://zhuanlan.zhihu.com/p/150291837
看了一眼自关联,没搞懂,试了一下也没成功。
over方式一下结果就出来了,好用。
/* 需求:累计求和六种算法效率比较 作者:felix 日期:2020-06-23 */ --第一步,准备测试数据 --IF OBJECT_ID(N'dbo.t') IS NOT NULL -- DROP TABLE dbo.t; --GO --CREATE TABLE dbo.t --( -- i BIGINT IDENTITY(1, 1) PRIMARY KEY, -- d MONEY --); --INSERT t --( -- d --) --SELECT TOP 31465 -- ROUND(10000 * RAND(CHECKSUM(NEWID())), 2) --FROM sys.all_objects AS a -- CROSS JOIN sys.all_objects; ----第二步,创建记录时间的表格 --IF OBJECT_ID(N'dbo.record_time') IS NOT NULL -- DROP TABLE dbo.record_time; --GO --CREATE TABLE dbo.record_time --( -- i INT IDENTITY PRIMARY KEY, -- 算法 NVARCHAR(10), -- bt DATETIME2,--开始时间 -- et DATETIME2,--结束时间 -- idiff AS DATEDIFF(ms, bt, et)--所用的毫秒数 --); --第一种方法,自连接法,sql server 2008以上版本测试通过,157255661.40 SET STATISTICS TIME OFF; SET STATISTICS IO OFF; GO DECLARE @bt DATETIME2 = GETDATE(); SELECT a.i, a.d, SUM(b.d) AS total_sum FROM dbo.t AS a INNER JOIN dbo.t AS b ON b.i <= a.i GROUP BY a.i, a.d; DECLARE @et DATETIME2 = GETDATE(); INSERT INTO dbo.record_time ( 算法, bt, et ) VALUES ('自连接', @bt, @et); --ORDER BY a.i; GO ; --第二种方法,递归,sql server 2008以上版本测试通过,157255661.40 DECLARE @bt DATETIME2 = GETDATE(); WITH cte_total_sum AS (SELECT i, d, d AS total_sum FROM dbo.t WHERE i = 1 UNION ALL SELECT s.i, s.d, p.total_sum + s.d AS total_sum FROM dbo.t AS s INNER JOIN cte_total_sum AS p ON s.i - 1 = p.i) SELECT * FROM cte_total_sum OPTION (MAXRECURSION 0); DECLARE @et DATETIME2 = GETDATE(); INSERT INTO dbo.record_time ( 算法, bt, et ) VALUES ('递归', @bt, @et); GO