求个高效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
...全文
167 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社区
加入

5.9w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2017-11-21 10:18
社区公告
暂无公告