如何使用当前行中的上一行值生成的上一个结果?

Posted

技术标签:

【中文标题】如何使用当前行中的上一行值生成的上一个结果?【英文标题】:How to use previous result that is made with previous row value in current row? 【发布时间】:2021-03-11 04:24:36 【问题描述】:

我想问一下如何使用当前行中的上一行值生成的上一个结果。

例如,

我想在主查询中创建新列“NUM2”。

如图所示,第二行的 NUM2 由 3 * 2(第一行的 NUM2)组成

并且,第三行的 NUM1 是由 6 * 6(第二行的 NUM2,这个值是 3 * 2(第一行的 NUM2)的结果)

当我第一次遇到这个问题时,我想如果我可以使用变量,我可以解决这个问题。

但我不知道如何在 DML 情况下使用变量。

如果你能给我一些建议,我真的很感激。

(我使用的是 oracle 11g)

【问题讨论】:

您不能认真考虑在字符串列中使用诸如 'FIRST'、'SECOND' 等字符串值来order 行,你可以吗?除此之外 - 请创建一个稍长的输入(例如,四行);使用有意义的排序方法(例如,不要使用名为 name 的字符串列,而是使用名为 seqord 的数字列),并显示您希望从该输入获得的输出。 您可以使用分析函数 LAG 来访问结果集中前几行中的数据 - 这对您有帮助吗? @KoenLostrie 我刚刚编辑了这篇文章并添加了一张图片。那你能帮我回答一下这个问题吗? @mathguy 我刚刚编辑了这篇文章并添加了一张图片。那你能帮我回答一下这个问题吗? 我会重复我的问题。您需要能够在order by 问题中使用排序列。什么排序允许您将FIRST 作为第一,SECOND 作为第二,THIRD 作为第三,FOURTH 作为第四,等等?这简直是​​疯了。你不能像其他人一样使用数字(1、2、3、4)吗?除此之外,这个问题并不难。 NUM2 列中的值 2 来自哪里?您是否将其作为绑定变量传入? 【参考方案1】:

您可以使用MODEL 子句:

WITH A ( name, num1 ) AS (
  SELECT 'FIRST',   1 FROM DUAL UNION ALL
  SELECT 'SECOND',  3 FROM DUAL UNION ALL
  SELECT 'THIRD',   6 FROM DUAL UNION ALL
  SELECT 'FOURTH', 10 FROM DUAL UNION ALL
  SELECT 'FIFTH',   2 FROM DUAL
)
SELECT name, num1, num2
FROM   a
MODEL
  DIMENSION BY (ROWNUM AS rn)
  MEASURES ( name, num1, 2 AS num2)
  RULES (
    num2[rn>1] = num1[cv(rn)] * num2[cv(rn)-1]
  )

哪些输出:

姓名 |第 1 个 | NUM2 :----- | ---: | ---: 第一 | 1 | 2 第二 | 3 | 6 第三 | 6 | 36 第四 | 10 | 360 第五| 2 | 720

db小提琴here

【讨论】:

我刚刚编辑了这篇文章并添加了一张图片。那你能帮我回答这个问题吗?我认为你写的第二个答案是这个问题的正确答案。对吗?

以上是关于如何使用当前行中的上一行值生成的上一个结果?的主要内容,如果未能解决你的问题,请参考以下文章

MFC ListCtrl如何查找某一行的上一行或者下一行

如果其他 UIView 带有隐藏选项,如何使下 UIView 固定到 UIScrollView 中的上 UIView?

使用 jQuery 检索表中的上一行和下一行

SparkSql 查询以从 cassandra 获取定义值的上一行和下一行

execl中如何统计某列中指定数值的上一行数值?

如何在 ios 中的一个控制器的按钮操作中返回当前的上一个视图