问题
在一次 clickhouse 的数据查询的时候,QA 反馈说列表中某些指标数据出现了几十位的小数。开始以为是 DataFormat 时候 bug
导致的。于是从接口入手开始跟数据,一直跟到数据源,发现几十位的小数点一直都在。最后打印了执行 sql 在 DataGrip 中执行。
发现 sql 产生的数据就带有几十位的小数点,详见图例。之前在 clickhouse 聚合查询的时候会出现小数后面数字浮动的情况,但
这种明显又是另一类的问题。
解决
于是开始分析这个几千行的 sql,精简后其实主要是两个表的单独分组聚合然后再进行关联。单独执行子查询数据是正常的。
经过反复尝试后,** 发现是 子查询 子查询 子查询 中使用了 select * 导致的,将这里换成具体查询的字段数据就正常了 **。
这里使用 * 是因为报表是需要根据用户所选择的字段动态展示。
SQL
SELECT
*
FROM
(
SELECT
fieldsa,
fieldsb,
fields1c
FROM
table1
WHERE
condition1
ORDER BY
fields1c DESC
)
ANY LEFT JOIN
(
SELECT
* // 将这里换成具体要查询的字段就可以了
FROM
(
SELECT
fieldsa,
fieldsb,
round(sum(fields2c) / 1, 2) AS fields2c,
round(sum(fields2d) / 1, 2) AS fields2d
FROM
table2
WHERE
condition2
GROUP BY
fieldsa,fieldsb
)
ALL FULL JOIN
(
SELECT
fieldsa,
fieldsb,
round(sum(fields3c) / 1, 2) AS fields3c,
round(sum(fields3d) / 1, 2) AS fields3d
FROM
table3
WHERE
condition3
GROUP BY
fieldsa,fieldsb
)
USING
fieldsa,fieldsb
WHERE
condition4
)
USING
fieldsa,fieldsb
图例