我有
的查询STANDARD_HASH(Column1|Column2|ColumnN, 'MD5') AS HashValue
表格中的每一行。
是否可以通过ColumnX进行GROUP并生成散列值的聚合?
我已经尝试过LISTAGG,但不幸的是,这会产生过大的连接而没有错误(我可能不会正确应用这个)。
PSEUDO ORACLE介绍我想要实现的目标:
SELECT ColumnX, UNKNOWN_AGGREGATE_FUNC(STANDARD_HASH(Column1|Column2|ColumnN, 'MD5'))
FROM TableY
GROUP BY ColumnX
基本上我的理由是,理想情况下我想通过ColumnX批量处理哈希值,这样我就可以通过线路传输批处理结果,以便与外部系统进行比较,因此不必每次传输在批次匹配的情况下排。
答案 0 :(得分:2)
将哈希值转换为数字,对每批次的哈希值求和,然后比较总和。
--drop table tableY;
create table tableY(columnX number, column1 number, column2 number, columnN number);
insert into tableY values(1, 1,1,1);
insert into tableY values(1, 2,2,2);
insert into tableY values(2, 1,1,1);
insert into tableY values(2, 2,2,2);
insert into tableY values(3, 1,1,1);
转换有点难看。其中一个主要限制是数字精度,这是SUBSTR(..., 1, 15)
。
这样的子串和求和哈希可能会丢失一些重要的加密属性,但这应该足以进行比较。
select
columnX,
trim(
upper(
to_char(hash_sum, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
)
) hash_sum
from
(
select columnX,
sum(
to_number(
substr(
standard_hash(column1||column2||columnN, 'MD5')
, 1, 15
)
, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
)
) hash_sum
from tableY
group by columnX
);
COLUMNX HASH_SUM
------- --------
1 1264B85078436A7F
2 1264B85078436A7F
3 698D51A19D8A121
答案 1 :(得分:1)
Oracle 20c支持CHECKSUM分析/聚合功能:
使用CHECKSUM检测表中的更改。表中行的顺序不会影响结果。
您可以将CHECKSUM与DISTINCT一起使用,作为GROUP BY查询的一部分,作为窗口函数或分析函数。
伪代码:
SELECT ColumnX, CHECKSUM(STANDARD_HASH(Column1|Column2|ColumnN, 'MD5'))
FROM TableY
GROUP BY ColumnX;