以下查询未返回slope
和intercept
的预期/期望结果。我终于意识到slope
和intercept
在我的锚点查询中被强制转换为整数,并通过递归保持整数。
WITH RECURSIVE t AS (
SELECT id parentId, idPublic parentIdPublic, name parentName,
slope parentSlope, intercept parentIntercept,
id, idPublic, name, type, 1 slope, 0 intercept, value
FROM measurements
WHERE id IN (414,415,416,417,491)
UNION ALL
SELECT t.parentId, t.parentIdPublic, t.parentName,
t.parentSlope, t.parentIntercept,
m.id, m.idPublic, m.name, m.type,
t.slope*pchm.sign*m.slope slope,
t.intercept+t.slope*pchm.sign*m.intercept intercept, m.value
FROM t
INNER JOIN subpoints sp ON sp.measurementId=t.id
INNER JOIN measurements m ON m.id=sp.measurementId
)
SELECT slope, intercept FROM t;
slope
和intercept
需要能够存储大量不同的值,并且准确度并不重要,所以我觉得FLOAT
是最好的。我slope
和intercept
的架构如下所示:
`slope` FLOAT NOT NULL DEFAULT 1,
`intercept` FLOAT NOT NULL DEFAULT 0,
作为黑客解决方案,我将我的锚点查询更改为:
SELECT id parentId, ..., 1.0 slope, 0.0 intercept, value
我认为正确的解决方案是将这两个值指定为FLOAT
,但文档似乎不允许。我可以DECIMAL
,但是,slope
和intercept
可能存在广泛的价值问题。
我可以将slope
和intercept
投射到FLOAT
吗?如果没有,最佳解决方案是什么?
答案 0 :(得分:0)
我认为 UNION
是恶棍,而不是WITH
等等。UNION
喜欢根据首先定义数据类型 SELECT
。当然,对于WITH RECURSIVE
,您无法选择交换SELECTs
。
所以...我投票给你的'黑客解决方案'0.0和1.0。或者,这些可能更清楚:0e0和1e0。 (仍然是一个kludge,但它指向FLOAT
,而不是DECIMAL
。)
我也感到遗憾的是CASTing
FLOAT
DOUBLE
(或{{1}})的缺席。