为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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) 的结果列被物化为较低标度的数值类型,后续计算使用了已经舍入的值。
希望确认:
复现脚本
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物化临时表之间的数值精度或类型推导不一致,请协助确认属于产品设计、文档未明确的行为,还是需要修复的精度一致性问题,谢谢。
感谢您的反馈,我们会跟进分析。
上述场景属于正常情况。
1、精度的载断/舍入在最后NSET填数据到返回内容上。
(1)从表上查询时,AVG(int)的精度是6,存入表的数据会被截断/舍入。查询时源数据是已截断/舍入,符合精度要求的数据。
(2)从视图/使用CTE时,下层AAGR不会将结果数据截断/舍入。NSET返回结果时只有MIN/MAX会将数据载断/舍入。
2、结果为DEC的AVG(int)作为参数,MIN/MAX精度与参数一致为6,SUM/AVG精度为0。

补充一个可能与本问题同源的复现场景。
前一个案例中,差异出现在 AVG 结果参与算术表达式时;本案例中,差异出现在 AVG 结果再次参与外层聚合时。
两个案例的共同点是:
视图与 CTE 结果一致;
CTAS 全局临时表物化后的结果与视图、CTE不同;
差异均出现在 AVG 结果的小数精度上。
补充案例:单行结果上的外层聚合精度不一致
复现脚本
DROP VIEW IF EXISTS V_DM_3113;
DROP TABLE IF EXISTS TEMP_DM_3113;
DROP TABLE IF EXISTS T_DM_3113;
CREATE TABLE T_DM_3113
(
C1 INTEGER
);
INSERT INTO T_DM_3113 VALUES (NULL);
INSERT INTO T_DM_3113 VALUES (-832789);
INSERT INTO T_DM_3113 VALUES (NULL);
INSERT INTO T_DM_3113 VALUES (-1829418);
INSERT INTO T_DM_3113 VALUES (-959667);
INSERT INTO T_DM_3113 VALUES (42669);
INSERT INTO T_DM_3113 VALUES (-1709102);
INSERT INTO T_DM_3113 VALUES (-792562);
INSERT INTO T_DM_3113 VALUES (-1495760);
INSERT INTO T_DM_3113 VALUES (NULL);
INSERT INTO T_DM_3113 VALUES (687048);
INSERT INTO T_DM_3113 VALUES (603021);
INSERT INTO T_DM_3113 VALUES (865728);
INSERT INTO T_DM_3113 VALUES (-311117);
INSERT INTO T_DM_3113 VALUES (NULL);
INSERT INTO T_DM_3113 VALUES (NULL);
INSERT INTO T_DM_3113 VALUES (1389171);
INSERT INTO T_DM_3113 VALUES (-550538);
INSERT INTO T_DM_3113 VALUES (635808);
非空数据共14行,合计为 -4257508,数学平均值为:
-4257508 / 14
= -304107.714285714285...
视图场景
CREATE VIEW V_DM_3113
(
VC_0,
VC_1,
VC_2,
VC_3,
VC_4,
VC_5
)
AS
SELECT
COUNT() AS VC_0,
COUNT(C1) AS VC_1,
MIN(C1) AS VC_2,
MAX(C1) AS VC_3,
SUM(C1) AS VC_4,
AVG(C1) AS VC_5
FROM T_DM_3113;
SELECT
COUNT() AS C0,
COUNT(VC_5) AS C1,
MIN(VC_5) AS C2,
MAX(VC_5) AS C3,
SUM(VC_5) AS C4,
AVG(VC_5) AS C5
FROM V_DM_3113;
实际结果:
C0 = 1
C1 = 1
C2 = -304107.714286
C3 = -304107.714286
C4 = -304107.714285714
C5 = -304107.714285714
CTE场景
WITH CTE AS
(
SELECT
COUNT() AS VC_0,
COUNT(C1) AS VC_1,
MIN(C1) AS VC_2,
MAX(C1) AS VC_3,
SUM(C1) AS VC_4,
AVG(C1) AS VC_5
FROM T_DM_3113
)
SELECT
COUNT() AS C0,
COUNT(VC_5) AS C1,
MIN(VC_5) AS C2,
MAX(VC_5) AS C3,
SUM(VC_5) AS C4,
AVG(VC_5) AS C5
FROM CTE;
实际结果:
C0 = 1
C1 = 1
C2 = -304107.714286
C3 = -304107.714286
C4 = -304107.714285714
C5 = -304107.714285714
CTAS全局临时表场景
CREATE GLOBAL TEMPORARY TABLE TEMP_DM_3113
ON COMMIT PRESERVE ROWS
AS
SELECT
COUNT() AS VC_0,
COUNT(C1) AS VC_1,
MIN(C1) AS VC_2,
MAX(C1) AS VC_3,
SUM(C1) AS VC_4,
AVG(C1) AS VC_5
FROM T_DM_3113;
SELECT
COUNT() AS C0,
COUNT(VC_5) AS C1,
MIN(VC_5) AS C2,
MAX(VC_5) AS C3,
SUM(VC_5) AS C4,
AVG(VC_5) AS C5
FROM TEMP_DM_3113;
实际结果:
C0 = 1
C1 = 1
C2 = -304107.714286
C3 = -304107.714286
C4 = -304107.714286
C5 = -304107.714286
结果对比
来源 MIN(VC_5) MAX(VC_5) SUM(VC_5) AVG(VC_5)
视图 -304107.714286 -304107.714286 -304107.714285714 -304107.714285714
CTE -304107.714286 -304107.714286 -304107.714285714 -304107.714285714
CTAS临时表 -304107.714286 -304107.714286 -304107.714286 -304107.714286
视图和 CTE 的内层结果均只有一行,并且 VC_5 非空。
因此,外层:
MIN(VC_5)
MAX(VC_5)
SUM(VC_5)
AVG(VC_5)
均基于同一行中的同一个 VC_5 值。理论上四个聚合结果的数值应当一致,但当前 MIN/MAX 与 SUM/AVG 使用了不同的有效精度。
从结果推测:
MIN/MAX 使用了已舍入为六位小数的视图或CTE输出值;
SUM/AVG 可能在视图或CTE展开后,继续使用了底层 AVG(C1) 舍入前的内部值;
CTAS临时表完成物化后,四个外层聚合均使用已固定为六位小数的值。
请协助确认:
本案例是否与原帖中的“AVG结果参与算术表达式时精度不一致”属于同一个问题;
单行输入时,MIN/MAX 与 SUM/AVG 对同一列返回不同数值是否符合产品设计;
是否存在视图或CTE展开后,部分外层表达式绕过内层结果列精度边界的情况;
若属于问题,是否有相关补丁或可临时关闭的优化参数。