将重置计数器(在列的值更改时重置)添加到视图中的 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 中,基于变量字段进行分组,并为特定值添加一个计数器(当变量更改时重置)