cwui 2024-06-27 19:24 采纳率: 27.8%
浏览 14
已结题

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

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

img

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

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

  • 写回答

28条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-27 19:24
    关注
    获得0.60元问题酬金

    引自免费微信小程序:皆我百晓生

    为了解决这个问题,我们可以使用SQL的递归查询功能来计算总和。由于不同的数据库管理系统对于递归查询的实现方式有所不同,这里我将使用通用的SQL逻辑进行说明。首先,我们需要一个临时表来存储我们的数据并进行计算。由于你没有提供具体的数据库结构,我将基于你给出的数据进行假设。假设我们有一个名为 my_table 的表,其中包含以下列: 序号数量。我们可以按照以下步骤进行操作:

    步骤 1:准备数据

    假设你的数据已经存储在名为 my_table 的表中。你需要按照 序号 从大到小排序。如果数据库支持 ORDER BY 子句和窗口函数(例如 ROW_NUMBER()),你可以使用以下查询来获取排序后的数据:

    SELECT 序号, 数量
    FROM (
      SELECT 序号, 数量, ROW_NUMBER() OVER (ORDER BY 序号 DESC) AS rn
      FROM my_table
    ) t
    WHERE rn <= 需要处理的行数(这里假设为所有行)
    ORDER BY rn;
    

    步骤 2:计算总和和正数总和

    我们可以使用递归查询来计算所有数量的总和(A)和正数的总和(B)。但是,由于不是所有数据库都支持递归查询,这里提供一个非递归的解决方案来计算总和:使用窗口函数累加所有数量值。计算正数总和稍微复杂一些,我们需要使用CASE语句或类似的逻辑来判断是否为正数。以下是一个可能的解决方案:

    步骤 3:实现覆盖逻辑

    这是问题的核心部分,也是最复杂的部分。我们需要找到第一个出现负数的行,并将之前计算的总负值(A)覆盖到这一行。由于不是所有数据库都支持窗口函数中的行级操作,这个逻辑可能需要根据你使用的具体数据库进行调整。以下是一个可能的解决方案:

    假设你的数据库支持窗口函数和CASE语句,你可以使用以下的递归或非递归逻辑来实现这一点。由于涉及复杂逻辑和特定数据库系统的功能,以下代码可能需要根据你的具体情况进行调整。以下是伪代码或逻辑示例:

    非递归解决方案(适用于支持窗口函数的数据库)

    假设我们已经计算出了总和A和正数总和B的值,我们可以使用以下查询来找到第一个出现负数的行并更新其值:

    WITH cumulative_sums AS (
      -- 计算累计总和的CTE(公共表达式)... 可能涉及到使用窗口函数或其他方法累积计算所有行的累计和(跳过第一行用于总正数的值)等等... 你需要根据具体情况进行调整。这只是一个伪代码示例。你需要根据具体情况调整CTE中的逻辑和计算方式。这个CTE将返回每一行的累计总和值。然后我们可以使用这些值来找到第一个出现负数的行并更新其值。这通常涉及到在更新语句中使用CASE语句或类似的逻辑来处理条件逻辑以及比较不同行的累计和的值。这样,我们只需要一次查询来找到并更新负数值的第一行记录(注意SQL方言可能有差异)。如果使用的是不支持窗口函数的数据库系统,可能需要更复杂的逻辑来实现相同的功能。你可能需要使用存储过程或临时表来存储中间结果并处理复杂的逻辑。请注意,这个示例没有提供完整的代码实现细节,因为这取决于你使用的具体数据库系统和你想要的结果的精确细节。如果你提供更多的关于你的数据库系统的信息和你想要实现的具体结果细节,我可以提供更具体的帮助和代码示例。希望这个答案能帮助你理解如何解决这个问题并提供一些可能的解决方案方向。你可以尝试根据你的具体情况调整这些逻辑或寻求专业的数据库管理员或开发者的帮助来实现你的需求。如果使用的是不支持窗口函数的数据库系统,可能需要更复杂的逻辑来实现相同的功能。你可能需要使用存储过程或临时表来存储中间结果并处理复杂的逻辑来找到第一个出现负数的行并更新其值以覆盖原来的数值(例如使用循环或条件语句)。在这种情况下,具体的实现细节将取决于你使用的数据库系统的语法和功能限制。请确保在实际应用中测试和验证任何解决方案的正确性和性能是否符合你的需求。
    
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月5日
  • 修改了问题 6月27日
  • 创建了问题 6月27日

悬赏问题

  • ¥15 问题重发,R语言:代码运行过程中出现如下警告,请求如何解决!
  • ¥15 苍穹外卖拦截器token为null
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响