Oracle — 分组依据和维护分组记录

Oracle - Group By and Maintain Grouping Records

提问人:sharan jain 提问时间:10/26/2023 最后编辑:sharan jain 更新时间:10/27/2023 访问量:43

问:

如何维护所有记录的分组并将其存储在单独的表中。

基表:

enter image description here

在对 COLA 、COLB 上的数据进行分组后,将其汇总为 COLC

Select COLA,COLB,SUM(COLC) 
FROM TAB2

然后使用 Sequence 生成密钥。

enter image description here

需要维护的输出如下。 考虑到有 100 列执行分组依据,我们如何保持这种关系

选项 1:尝试以下查询以获取结果,但它看起来确实有效。

Select TAB1.KEY , TAB2.KEY 
FROM TAB1 
INNER JOIN TAB2 ON TAB1.COLA=TAB2.COLA 
AND TAB2.COLB=TAB2.COLB

enter image description here

选项 2 : 在对数据进行分组和求和时,将 key 存储在逗号分隔的 clob 列中,然后在不同的 sql 中再次中断它。

RTRIM(XMLAGG(XMLELEMENT(E,KEY,',').EXTRACT('//text()') ).GetClobVal(),',')
SQL Oracle 分组 聚合函数 oracle19c

评论

0赞 Bogdan Dincescu 10/26/2023
有些事情似乎没有经过深思熟虑。如果在 tab1 中插入或删除了一些行,则在 tab2 中,数据将不再显示与 tab1 中当前内容相对应的总和。我认为你应该使用你所拥有的选择合并到 tab2 中......但是,合并超过 100 列会导致性能不佳。
0赞 sharan jain 10/27/2023
tab2 将在 tab1 中的数据准备就绪后运行。

答:

0赞 Bogdan Dincescu 10/27/2023 #1

因此,如果您需要按 N 列进行联接,其中有些恰好是 null,最好使用 standard_hash 进行联接。 像这样:

from table_1 a
join table_2 b on (
  standard_hash(a.col||'|'||a.col2||...||'|'||a.coln, 'SHA512')=
  standard_hash(b.col||'|'||b.col2||...||'|'||b.coln, 'SHA512')
  )

此函数还可用于创建索引。这就是我可能建议的。 我看到包含总和的表存在一个大问题。当第一个表上有一些插入、更新或删除时,您能确定它会同步吗?我宁愿创建一个视图或具体化视图。不过,当您拥有大量数据时,可能会出现问题。有分区吗?好吧,你应该比我更了解你的业务的各个方面......

评论

0赞 sharan jain 10/27/2023
是的,我的表是基于不同file_id分区的,我只逐个文件运行过程。