網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
看了一眼自關(guān)聯(lián),沒搞懂,試了一下也沒成功。
over方式一下結(jié)果就出來了,好用。
/* 需求:累計(jì)求和六種算法效率比較 作者:felix 日期:2020-06-23 */ --第一步,準(zhǔn)備測(cè)試數(shù)據(jù) --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; ----第二步,創(chuàng)建記錄時(shí)間的表格 --IF OBJECT_ID(N'dbo.record_time') IS NOT NULL -- DROP TABLE dbo.record_time; --CREATE TABLE dbo.record_time -- i INT IDENTITY PRIMARY KEY, -- 算法 NVARCHAR(10), -- bt DATETIME2,--開始時(shí)間 -- et DATETIME2,--結(jié)束時(shí)間 -- idiff AS DATEDIFF(ms, bt, et)--所用的毫秒數(shù) --第一種方法,自連接法,sql server 2008以上版本測(cè)試通過,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; ; --第二種方法,遞歸,sql server 2008以上版本測(cè)試通過,157255661.40 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); ('遞歸', @bt, @et); --第三種方法,over 子句,sql server 2012測(cè)試通過,sql server 2008不支持,157255661.40 SELECT i, d, SUM(d) OVER (ORDER BY i) AS total_sum FROM dbo.t; ('over子句', @bt, @et); --第四種,相關(guān)子查詢,sql server 2008以上版本測(cè)試通過,156625045.22 SELECT outquery.i, outquery.d, ( SELECT SUM(innerq.d) FROM dbo.t AS innerq WHERE innerq.i <= outquery.i ) AS ct --內(nèi)部查詢 FROM dbo.t AS outquery; ('相關(guān)子查詢', @bt, @et); --ORDER BY outquery.i; --外部查詢 --游標(biāo)方法,有兩種方法可以實(shí)現(xiàn),一種是臨時(shí)表更新,一種是變量疊加更新,157255661.40 --先增加一個(gè)存儲(chǔ)累計(jì)和的列 --第5種,游標(biāo)_臨時(shí)表更新 --ALTER TABLE dbo.t ADD total_d MONEY DEFAULT (0);--只運(yùn)行一次 DECLARE @t TABLE --定義表變量,存儲(chǔ)累計(jì)求和臨時(shí)結(jié)果 i INT PRIMARY KEY IDENTITY, d MONEY, total_d MONEY ); DECLARE @i INT = 0, @d MONEY = 0, @total_d MONEY = 0; DECLARE c1 CURSOR FOR SELECT i, d FROM dbo.t ORDER BY i; OPEN c1; FETCH c1 INTO @i, @d; WHILE @@FETCH_STATUS = 0 BEGIN SET @total_d += @d; INSERT INTO @t ( d, total_d ) VALUES (@d, @total_d); FETCH c1 INTO @i, @d; END; CLOSE c1; DEALLOCATE c1; UPDATE dbo.t SET total_d = b.total_d INNER JOIN @t AS b ON a.i = b.i; ('游標(biāo)_臨時(shí)表更新', @bt, @et); --第6種,游標(biāo)_變量疊加更新 DECLARE c1 CURSOR FOR SELECT i, d FROM dbo.t; --ORDER BY i; UPDATE dbo.t SET total_d = @total_d WHERE i = @i; ('游標(biāo)_變量疊加更新', @bt, @et); --執(zhí)行時(shí)間 over子句<游標(biāo)臨時(shí)表更新<游標(biāo)變量疊加更新<自連接<相關(guān)子查詢<遞歸查詢
補(bǔ)充:下面看下SQL server 累加求和
SQL server 累加求和
1.
SELECT SalesOrderID, ProductID, OrderQty ? ? ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS Total ? ? ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Avg" ? ? ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Count" ? ? ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Min" ? ? ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Max" FROM Sales.SalesOrderDetail? WHERE SalesOrderID IN(43659,43664);
2.
select SchSno,convert(varchar(10),a.Dates,120) Dates, sum(Amt_avail) over(partition by SchSno order by convert(varchar(10),a.Dates,120)) as PeriodPreAmt from jr_creditUserAcct a
原文鏈接:https://www.cnblogs.com/luna-hehe/p/15935342.html
相關(guān)推薦
- 2022-04-19 Django的開發(fā)步驟原來是這樣的_python
- 2022-11-21 Android?Jetpack系列之App?Startup使用詳解_Android
- 2022-10-18 C++數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹的實(shí)現(xiàn)詳解_C 語(yǔ)言
- 2023-11-12 Check failed: top_shape[j] == bottom[i]->shape(j)
- 2022-11-05 Swift?Extension擴(kuò)展得使用詳細(xì)介紹_Swift
- 2022-10-11 Xshell連接centOS7并與CentOS7聯(lián)網(wǎng)_Linux
- 2022-06-25 Docker?安裝?Consul單機(jī)模式的操作方法_docker
- 2022-04-23 .NET?Core使用APB?vNext框架入門教程_實(shí)用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支