CHECKSUM_AGG等效于Oracle

时间:2017-05-31 21:03:40

标签: sql oracle

我有

的查询
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批量处理哈希值,这样我就可以通过线路传输批处理结果,以便与外部系统进行比较,因此不必每次传输在批次匹配的情况下排。

2 个答案:

答案 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);

比较SQL

转换有点难看。其中一个主要限制是数字精度,这是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;