求个高效SQL语句

buller 2017-11-21 10:18:45
表格式如下(字段分别为ID(自增),项目ID,数量,累计数量):


ID xmid sl ljsl
1 001 2 2
2 002 3 3
3 003 2 2
4 001 1 3
5 004 2 2
6 006 1 1
7 001 2 5
8 002 -2 1





累计数量列是没有的,这里我方便查看写的,累计数量等于此xmid对应小于等于本条数据ID的sl之和
数据可能有十几万条,xmid有几千不等,有什么高效的方式更新这个ljsl?或者程序实现好点?

更多0
...全文
184 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lescper2011 2017-11-21
学习一下
  • 打赏
  • 举报
回复
随便写了下,不知道效率怎么样

SELECT a.*,b.ljsl FROM TJ a JOIN
(SELECT t1.ID,SUM(t2.sl) ljsl
FROM TJ t1
LEFT JOIN TJ t2 
ON t1.xmid=t2.xmid AND t1.ID >= t2.ID GROUP BY t1.ID) AS b ON a.ID=b.ID
  • 打赏
  • 举报
回复
max group by 没有捷径 如果要快点,就每天限时做了输出报表,然后忙时查询直接走报表(select xxx into stable)。
  • 打赏
  • 举报
回复
buller 2017-11-21
还是oracle性能好点,这样很慢,自己试过
  • 打赏
  • 举报
回复
听雨停了 2017-11-21
引用 楼主 buller 的回复:
表格式如下(字段分别为ID(自增),项目ID,数量,累计数量):


ID xmid sl ljsl
1 001 2 2
2 002 3 3
3 003 2 2
4 001 1 3
5 004 2 2
6 006 1 1
7 001 2 5
8 002 -2 1





累计数量列是没有的,这里我方便查看写的,累计数量等于此xmid对应小于等于本条数据ID的sl之和
数据可能有十几万条,xmid有几千不等,有什么高效的方式更新这个ljsl?或者程序实现好点?

更多0

如下sql一样,用一个递归求和就可以达到你的需求

use Tempdb
go
--> --> 听雨停了-->测试数据

if not object_id(N'Tempdb..#tab') is null
drop table #tab
Go
Create table #tab([ID] int,[xmid] nvarchar(23),[sl] int)
Insert #tab
select 1,N'001',2 union all
select 2,N'002',3 union all
select 3,N'003',2 union all
select 4,N'001',1 union all
select 5,N'004',2 union all
select 6,N'006',1 union all
select 7,N'001',2 union all
select 8,N'002',-2
--测试数据结束

;WITH cte AS (
SELECT * ,row_number() over(PARTITION BY xmid ORDER BY id ) as rn FROM #tab
),
cte2 AS (
SELECT id,xmid,sl,rn,sl AS sjsl FROM cte WHERE rn=1
UNION ALL
SELECT a.id,a.xmid,a.sl,a.rn,a.sl+b.sjsl FROM cte a
INNER JOIN cte2 b ON a.xmid=b.xmid AND a.rn=b.rn+1
)
SELECT id,xmid,sl,sjsl
FROM cte2
ORDER BY xmid,rn

  • 打赏
  • 举报
回复
发帖
.NET社区

6.0w+

社区成员

.NET技术交流专区
社区管理员
  • ASP.NET
  • R小R
  • 喵叔哟
加入社区
帖子事件
创建了帖子
2017-11-21 10:18
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。