我有一个包含两列的表格:
OLD_REVISIONS |NEW_REVISIONS
-----------------------------------
1,25,26,24 |1,26,24,25
1,56,55,54 |1,55,54
1 |1
1,2 |1
1,96,95,94 |1,96,94,95
1 |1
1 |1
1 |1
1 |1
1,2 |1,2
1 |1
1 |1
1 |1
1 |1
每行都将列出一个文档的修订版本列表(以逗号分隔)
逗号分隔的列表可能在两列中相同,但顺序/排序可能不同 - 例如:
2,1 |1,2
我想找到所有旧版修订版本列中最高版本低于新版修订版本列中最高版本的实例。
以下情况符合此标准:
OLD_REVISIONS |NEW_REVISIONS
-----------------------------------
1,2 |1
1,56,55,54 |1,55,54
我已经尝试使用MINUS选项(将表格连接到自身),但即使列表相同但顺序错误时,它也会返回差异。
我尝试了GREATEST函数(例如
greatest(new_Revisions) < greatest(old_revisions)
),但不确定为什么greatest(OLD_REVISIONS)总是只返回逗号分隔的值。 它没有返回最大值。 我怀疑它正在比较字符串,因为这些列是VARCHAR。
此外,MAX
函数期望单个数字。
有没有其他方法可以实现上述目标? 我正在寻找纯SQL选项,以便我可以打印出结果(或者是可以打印出结果的PL / SQL选项)
编辑
抱歉我没有提到,但对于NEW_REVISIONS,我实际上的确在一个表格中拥有每个修订版本都在单独的行中的数据:
"DOCNUMBER" "REVISIONNUMBER"
67 1
67 24
67 25
67 26
75 1
75 54
75 55
75 56
78 1
79 1
79 2
83 1
83 96
83 94
为了提供一些内容,几周前我怀疑有修订版本消失了。 为了调查这件事,我决定对所有文档的所有修订进行计数并拍摄快照以便稍后比较,看是否确实丢失了修订版本。
我拍摄的快照包含以下列:
docnumber、count、revisions
修订版本使用listagg函数以逗号分隔的列表存储。
我现在遇到的问题是,在实时表中添加了新的修订版本,因此当我使用MINUS比较主表和快照表时,由于主表中的新修订版本,我会得到一个差异。
即使在实际表中修订版本是单独的行,在快照表中我也没有单独的行。
我想唯一的重建快照的方式是以相同的格式,并比较它们是否找到主表中的最大修订版本是否低于快照表中的最大修订版本(因此我正在尝试找出如何在逗号分隔的字符串中找到最大值)。
max()
或greatest()
)都只会将它们作为字符串进行比较。你需要将字符串拆分成它们的组成数字。 - user5683823greatest(stringA, stringB)
将按照排序顺序返回两个字符串中的较大值。无论这两个字符串是否包含逗号,都不会影响结果,我不确定为什么有人会期望逗号会有所影响。 - William Robertson