将重置计数器(在列的值更改时重置)添加到视图中的 PLSQL 行

Posted

技术标签:

【中文标题】将重置计数器(在列的值更改时重置)添加到视图中的 PLSQL 行【英文标题】:Adding a resetting counter (reset on a column's value change) to a PLSQL line in a view 【发布时间】:2014-04-16 16:15:21 【问题描述】:

我正在使用 PL SQL 开发人员和 Oracle 11g。这是我的问题:

编辑

看起来使用排名(按标题编号分区,按日期排列的行号顺序)有效。

我想创建一个计数器,每当一列的值与上一列不同时,该计数器就会发生变化。我需要能够在视图中执行此操作(不可修改的约束)。目标是使用此计数器在该视图中构建一个新的唯一键。因此,每次计划表中的行号更改时,我都需要重置“计数器”(见下文)。

我有 3 张桌子。在每个表下我都放置了一些重要的列:

页眉 --headerNumber(唯一)

详情 --headerNumber(不是唯一的) --lineNumber(唯一)

规划线 --headerNumber(不是唯一的) --lineNumber(不是唯一的) --某个日期

在计划行表中,存在多行,每个行号也是如此。我想在一个视图中构建(这是一个约束,它必须是一个视图)能够从计划中构建一个唯一编号的行号。

以下是一些示例数据:

Header (1 row):
Header Number = 1

Detail (2 rows)
Header Number = 1, LineNumber = 1
Header Number = 1, LineNumber = 2

Planning (4 rows)
Header Number = 1, Line number = 1, date = 01/01/14
Header Number = 1, Line number = 1, date = 01/02/14
Header Number = 1, Line Number = 2, date = 01/01/14
Header Number = 1, Line Number = 2, date = 01/03/14

在视图中我希望它看起来像这样:

HeaderNumber   |   Line Number   |   'Counter' (What I am trying to create)
1              |        1        |       1
1              |        1        |       2  
1              |        2        |       1
1              |        2        |       2

以下是我遇到的一些最终问题:

似乎我不能使用行号——视图将包含多个标题,更重要的是,行号似乎是由整个选择的内容构建的——因此我无法修剪它。行号最终计数为 1,2,3,4(上一行)。

有没有人知道如何将其构建到选择中(放入视图中)?我知道这可以通过一个过程来完成,但我真的需要一个视图。

问候,

严重困惑的人

【问题讨论】:

【参考方案1】:

我不确定您在说“行号”时到底尝试了什么 - 您是指 ROWNUM 还是 row_number()

这不是你想要的吗?

select headernumber, linenumber, 
       row_number() over (partition by headernumber order by linenumber)
          as counter
from   ...;

【讨论】:

感谢您的帮助——我以前使用过 Rownum。也使用排名似乎工作。让我尝试使用你的代码,看看它是否有效(我会测试并跟进) 您的代码也可以工作——我想我更喜欢 RANK() 的行为(对于重复项有间隙)。感谢您提供此替代选项 partition by 是我重置计数器时所缺少的

以上是关于将重置计数器(在列的值更改时重置)添加到视图中的 PLSQL 行的主要内容,如果未能解决你的问题,请参考以下文章

在 pyspark 中,基于变量字段进行分组,并为特定值添加一个计数器(当变量更改时重置)

SwiftUI List 在任何视图更改时重置滚动

如果我使用异步存储,当我更改屏幕时,我的值怎么会重置为 0?

SQL PARTITION BY:列值改变时重置计数

在新页面上重置“运行总计字段”

在列命令按钮重置中合并单元格