SQL 表中求同一列不同行的差值

lanxiaojun2 2014-10-17 03:06:35
Table Abc
ID 數量
1 30
2 20
3 16
4 24

求 ID 數量 數量差
1 30 10
2 20 4
3 16 -8
4 24 Null

怎麼寫SQL語句?大神,看你的了!!!
...全文
1604 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rubynle 2014-10-17
  • 打赏
  • 举报
回复
全表扫描,1楼的已经是最好的方法了
xiaodongni 2014-10-17
  • 打赏
  • 举报
回复
select* ,(select a.数量-b.数量 from tablename b where b.id=a.id+1)from tablename a 试试这个效率怎么样
bw555 2014-10-17
  • 打赏
  • 举报
回复
使用分析函数lead,ORACLE的写法,貌似sqlsever较高的版本才支持lead
select ID,數量,数量-lead(数量)over(order by id) as 數量差 from Abc
还在加载中灬 2014-10-17
  • 打赏
  • 举报
回复
引用 7 楼 reenjie 的回复:

select ID, 數量, 數量-(select 數量 from Abc where ID=a.ID+1) as  數量差  from Abc as a
200W的大表应该不合适子查询
还在加载中灬 2014-10-17
  • 打赏
  • 举报
回复
游标应该更慢且不可取吧~
reenjie 2014-10-17
  • 打赏
  • 举报
回复

select ID, 數量, 數量-(select 數量 from Abc where ID=a.ID+1) as  數量差  from Abc as a
还在加载中灬 2014-10-17
  • 打赏
  • 举报
回复
引用 4 楼 lanxiaojun2 的回复:
由於表數據量非常大,連接起來太慢,有沒有更好的辦法?
你试下,#1楼的方法,表连接应该很快了~~
lanxiaojun2 2014-10-17
  • 打赏
  • 举报
回复
引用 2 楼 ky_min 的回复:
递归~~
;WITH CTE AS(
	SELECT TOP 1 ID,[数量],CAST(NULL AS INT)[数量差]FROM Abc ORDER BY ID DESC
	UNION ALL
	SELECT A.ID,A.[数量],A.[数量]-B.[数量] FROM Abc A JOIN CTE B ON A.ID+1=B.ID
)
SELECT * FROM CTE ORDER BY ID
這個表的記錄接近200萬行,有沒有比較高效的辦法,我想取每行數據跟它上下行的數據做對比,如果是EXCEL的話,到可以很輕鬆的做到,到了SQL就悲劇了。
lanxiaojun2 2014-10-17
  • 打赏
  • 举报
回复
由於表數據量非常大,連接起來太慢,有沒有更好的辦法?
还在加载中灬 2014-10-17
  • 打赏
  • 举报
回复
对哦,貌似可以不用递归~~
还在加载中灬 2014-10-17
  • 打赏
  • 举报
回复
递归~~
;WITH CTE AS(
	SELECT TOP 1 ID,[数量],CAST(NULL AS INT)[数量差]FROM Abc ORDER BY ID DESC
	UNION ALL
	SELECT A.ID,A.[数量],A.[数量]-B.[数量] FROM Abc A JOIN CTE B ON A.ID+1=B.ID
)
SELECT * FROM CTE ORDER BY ID
AcHerat 2014-10-17
  • 打赏
  • 举报
回复

select a.id,a.数量 - b.数量
from abc a left join abc b on a.id + 1 = b.id

22,299

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧