注册

DM8 中 AVG(TINYINT) 经 CTAS 临时表物化后精度变化,导致与视图/CTE的算术结果不一致

Xy.Xie_WHU 2026/07/12 433 3

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
DM Database Server 64 V8
DB Version: 0x7000d
03134284552-20260414-322369-20221
Msg Version: 1
Gsu level(5) cnt: 102
DM 管理工具
【操作系统】:
Windows 11 64 位
【CPU】:
Intel x86_64
【问题描述】*:
在 DM8 中,同一个聚合查询分别通过视图、CTE和 CREATE GLOBAL TEMPORARY TABLE ... AS SELECT 使用时,查询行数一致,但 AVG(TINYINT) 参与后续算术表达式后的结果精度不一致。
视图和 CTE 的结果为:
E0 E1


15.388889 30.7777777777778
全局临时表的结果为:
E0 E1


15.388889 30.777778
三个查询中的 E0 显示值相同,但以下表达式的结果不同:
COALESCE(VC_5, 0) * 2
怀疑通过 CTAS 创建全局临时表时,AVG(C0) 的结果列被物化为较低标度的数值类型,后续计算使用了已经舍入的值。
希望确认:

  1. AVG(TINYINT) 在视图和 CTE 中实际使用的数据类型、精度和标度是什么?
  2. CTAS 创建全局临时表时,AVG(TINYINT) 结果列的数据类型、精度和标度如何推导?
  3. 视图、CTE和CTAS临时表之间出现这种精度差异是否为预期行为?
  4. 若属于预期行为,如何使临时表物化后的精度与视图、CTE保持一致?
  5. 若不属于预期行为,是否为 CTAS 列类型或标度推导问题?

复现脚本
CREATE SCHEMA database0;
SET SCHEMA database0;
drop table if EXISTS T_DM_304;
drop view if EXISTS V_DM_304;
drop table if EXISTS TEMP_DM_304;
drop table if EXISTS TEMPOCPR_DM_304;

CREATE TABLE T_DM_304 (C0 TINYINT, C1 CHAR(2), C2 BLOB, C3 BLOB);

INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (-3, 'GD', 0x32195d, 0x41cfa1efbf1a168bd9b2509d0ff9523727c57dc37ff6a55d06bb833975c3b022e4f6731510b6cb426f0767c65916d651e5feec9b5af0c0);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (11, NULL, 0x6433eac2f5d6db7d7c4d4281115d15258425ab273ed80b8d969d55, 0x3b418f9dd614cab46c4df4f2543739ccee471a48dbdcf136dcf4ef976b747fc848b7f69d07b541);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (-24, '', 0x489ed79d4340dada584c5e006e65f83bb9c29358b6c3b171dfd9fd4f91f03b2d865bd377471c, 0x8773939386);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (123, 'gD', 0x4230a1345e49a6e9142d48bba39d5d60b55e3941c436a14be59c32b46bde32ac351113283cac36061f02088e14b8ea532671f250c67c4685a9e164d2771b, 0xd58a0c);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (114, '', 0x21a279c849cf150723, 0x67fa5e37f62fb5ef31175b65940419ac2e82be99ea7fd5376eb4c7a702cc9854e4ec8b3c4e60bc28e066f41b2a3767cc1b8c7442);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (76, 'T', 0x47b2157df4f07a839183a5a9b6d644e4bc7224633e8108cadae181d9dc, 0x0fc2081150bac3d9bf7e78a5a8bbb802d45625cbf579a996aa37417f050fbdf61be641345adb839d62d4901579e2badd0dc3553b5649c944369b15);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (117, 'Za', 0x22c415075edc863ea52b2d796acbe6c53f2a9863, NULL);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (55, '', 0x02759c2e02a4cb08b23cbd16d3721b91255aa73779a1fc5653c6614bfbb1bf3fe2423178cb3b456732ea98ffd24600df5918afe9, 0x901bdff1);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (6, NULL, 0x982df17b6131a73220ea617dbebf6351b2f2968d248e71c5d97e6fa765841ca3b0abad1393b9f002bd2409dd1bd732c844c000b51356f56556291ea583e622, 0x07b5b80df4b68c22577c4e228ed5307d06b0becb4073851f8f5cdbaa604844ea542e54326fc8decec04be991c473cf862ce690a369cc137c);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (-12, 'Z', 0xd330090e62616f9bdf, 0xdac42ec8da12ba5409a2799a2abded24fcb4aa8190d2db823f5b34cc10641d);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (NULL, '_', 0xbdcb32c67303896a5b64e1, 0x89320563b055153fe4d3363595ece1f328580410150e3cf7d172c87139983b154145ae41788649a1911908907e65df98fd358a17c7ebb3f2e6f909ab86);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (-45, 'B3', 0x6d58e2599da86d777a68a08def83a5a1cb90c9a476a7d27fe56545a354066ed5332a0f2e7de7b290666dd9f585a2d9ab1e, 0xa8e93ec084baa86f4317136f7454944195a2366c2c56f338a430c561c2578d3ec9a0e60cd3a123339364d5e28bb44294);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (NULL, '', NULL, 0x8d);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (109, NULL, 0xf68ce0b53fd6cc4a41a9c943b449556b4998c5a4425f17c172d5, 0xe1825c32eacf77be1a90a920a3adff477bd0711e2e920e2a92a835f2c864568e638dd2f87f5fba6a37715f901d05057526364b65105c62003aeb2cc3d62a);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (-5, NULL, 0x29f417e987563b5a8a440738541d12bc99558fced5dcb492ccd1a3470df581408bcbf97a10e622d281b7eb25a6341d03a5cb8752d5ca161709c1f5, 0xdc4df8d83807f403e2bbbf782a3bd900815d);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (-109, NULL, 0x0c5dd7d4db64beef7893fa0eb47134b912fa2cf9c211f468fc3abb2c6bbe29, 0x802841eb);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (-49, NULL, 0xe910147bd5f95730c3290ca6481b782e04ca697fd41ac61e54e3696f8d74b43290ba1dbe96152509123d2dcaed373a9dde, 0x1b9d80ba2d1b69a8a6ae080f66ba416c0856baee0f9b8ba04a95968334);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (-114, 'a', 0x23ed, 0x2dc56941e1b649);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (21, 'f', 0x3d2b6292b31565fce9302078c36877ad21167a58baca67850f7eaa31c6ba3735aa0af75b1b15548bf77e91542d8198a00f1a15c1dc8643f49ffba3, 0xd29e88f401bfa1df6b1c8d53214861cd3f733bf7053632c33b38561ffb47df705b77b5e5b3b3faf964);
INSERT INTO T_DM_304 (C0, C1, C2, C3) VALUES (6, '', 0x043b28b9505557c187a0ff1a46893f10e1d793c317, 0xdf946049b01905);

CREATE VIEW V_DM_304 (VC_0, VC_1, VC_2, VC_3, VC_4, VC_5) AS SELECT COUNT(*) AS VC_0, COUNT(C0) AS VC_1, MIN(C0) AS VC_2, MAX(C0) AS VC_3, SUM(C0) AS VC_4, AVG(C0) AS VC_5 FROM T_DM_304;
SELECT VC_5 AS E0, COALESCE(VC_5,0) * 2 AS E1 FROM V_DM_304;
-- 15.388889 30.7777777777778

WITH CTE AS (SELECT COUNT(*) AS VC_0, COUNT(C0) AS VC_1, MIN(C0) AS VC_2, MAX(C0) AS VC_3, SUM(C0) AS VC_4, AVG(C0) AS VC_5 FROM T_DM_304) SELECT VC_5 AS E0, COALESCE(VC_5,0) * 2 AS E1 FROM CTE;
-- 15.388889 30.7777777777778

CREATE GLOBAL TEMPORARY TABLE TEMP_DM_304 ON COMMIT PRESERVE ROWS AS SELECT COUNT(*) AS VC_0, COUNT(C0) AS VC_1, MIN(C0) AS VC_2, MAX(C0) AS VC_3, SUM(C0) AS VC_4, AVG(C0) AS VC_5 FROM T_DM_304;
SELECT VC_5 AS E0, COALESCE(VC_5,0) * 2 AS E1 FROM TEMP_DM_304;
-- 15.388889 30.777778

该现象表现为视图、CTE和CTAS物化临时表之间的数值精度或类型推导不一致,请协助确认属于产品设计、文档未明确的行为,还是需要修复的精度一致性问题,谢谢。

回答 0
暂无回答
扫一扫
联系客服