欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > SQL 数组,游标,递归覆盖原值

SQL 数组,游标,递归覆盖原值

2025/5/9 6:24:42 来源:https://blog.csdn.net/weixin_43970743/article/details/140033775  浏览:    关键词:SQL 数组,游标,递归覆盖原值

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  下列数据通过SQL语句查出,不是数据库底表的数据, 不能通过insert , update,delete 等来更改原始数据

  先把序号从大到小排序,求出所有数量合计值 A = -20 , 再求出所有正数的合计值B = 100+20 = 120
  然后从最大序号的负数(序号4 = -100)逐一向下与B合计,直到与B的合计值出现了负数(序号3 )。
  此时,把A (-20) 覆盖到第一次出现负数的序号3即可。

如何用SQL实现,或提供思路

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

  这个问题可以通过使用游标和递归的公用表表达式(CTE)来解决。以下是一个可能的解决方案的思路:

  1. 排序:首先,根据序号从大到小对数据进行排序。
  2. 计算合计值:使用聚合函数计算所有数量的合计值A和所有正数的合计值B
  3. 使用游标遍历:使用游标从最大的序号开始向下遍历,每次从B中减去当前行的数量,直到B变成负数。
  4. 递归CTE:使用递归CTE来模拟游标的行为,逐步更新B的值,直到它变成负数。
  5. 覆盖操作:一旦B变成负数,使用最终的A覆盖该行的数量。

以下是使用PostgreSQL数据库的示例SQL语句:

WITH RECURSIVE DataCTE AS (SELECT number_id,quantity,(SELECT SUM(quantity) FROM YourTable) AS total_sum_A,(SELECT SUM(CASE WHEN quantity > 0 THEN quantity ELSE 0 END) FROM YourTable) AS total_sum_BFROM YourTable
),
UpdatedCTE AS (SELECT number_id,quantity,total_sum_A,total_sum_B,quantity AS updated_quantityFROM DataCTEWHERE number_id = (SELECT MAX(number_id) FROM DataCTE)UNION ALLSELECT dt.number_id,dt.quantity,dt.total_sum_A,dt.total_sum_B - dt.quantity AS total_sum_B,CASE WHEN dt.total_sum_B < 0 THEN total_sum_A ELSE dt.quantity END AS updated_quantityFROM DataCTE dtINNER JOIN UpdatedCTE ut ON dt.number_id = ut.number_id - 1
)
SELECT number_id,updated_quantity
FROM UpdatedCTE
ORDER BY number_id DESC;

  请注意,这个解决方案假设number_id是一个连续的序号,并且可以通过number_id - 1来获取上一行的数据。如果number_id不是连续的,你需要根据实际情况调整递归逻辑。

  这个解决方案可能需要根据你的具体数据库系统进行调整,因为不同的数据库系统对递归CTE的支持可能有所不同。如果你使用的是MySQL 8.0+,SQL Server或Oracle,它们都支持递归CTE,但是语法可能略有不同。

  此外,由于题目要求不能更改原始数据,上述查询只是用来展示逻辑,并不实际修改任何数据。如果你需要将结果存储回数据库,可以考虑使用一个临时表或将结果插入到新表中。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词