網站首頁 編程語言 正文
看了一眼自關聯,沒搞懂,試了一下也沒成功。
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; --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; ; --第二種方法,遞歸,sql server 2008以上版本測試通過,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測試通過,sql server 2008不支持,157255661.40 SELECT i, d, SUM(d) OVER (ORDER BY i) AS total_sum FROM dbo.t; ('over子句', @bt, @et); --第四種,相關子查詢,sql server 2008以上版本測試通過,156625045.22 SELECT outquery.i, outquery.d, ( SELECT SUM(innerq.d) FROM dbo.t AS innerq WHERE innerq.i <= outquery.i ) AS ct --內部查詢 FROM dbo.t AS outquery; ('相關子查詢', @bt, @et); --ORDER BY outquery.i; --外部查詢 --游標方法,有兩種方法可以實現,一種是臨時表更新,一種是變量疊加更新,157255661.40 --先增加一個存儲累計和的列 --第5種,游標_臨時表更新 --ALTER TABLE dbo.t ADD total_d MONEY DEFAULT (0);--只運行一次 DECLARE @t TABLE --定義表變量,存儲累計求和臨時結果 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; ('游標_臨時表更新', @bt, @et); --第6種,游標_變量疊加更新 DECLARE c1 CURSOR FOR SELECT i, d FROM dbo.t; --ORDER BY i; UPDATE dbo.t SET total_d = @total_d WHERE i = @i; ('游標_變量疊加更新', @bt, @et); --執行時間 over子句<游標臨時表更新<游標變量疊加更新<自連接<相關子查詢<遞歸查詢
補充:下面看下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
相關推薦
- 2022-04-23 pytorch實現圖像識別(實戰)_python
- 2023-04-03 Python調試神器之PySnooper的使用教程分享_python
- 2022-07-18 Pod創建多個容器并訪問指定容器
- 2022-03-24 Qt開發實現跨窗口信號槽通信_C 語言
- 2022-05-09 Python實現連接FTP并下載文件夾_python
- 2022-07-24 Redis中ServiceStack.Redis和StackExchange.Redis區別詳解_R
- 2022-02-28 npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT
- 2022-04-14 教你用python將數據寫入Excel文件中_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支