0

以下查询未返回我对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最好。我的架构slopeintercept如图所示:

`slope` FLOAT NOT NULL DEFAULT 1,
`intercept` FLOAT NOT NULL DEFAULT 0,

作为 hack 解决方案,我将锚查询更改为:

SELECT id parentId, ..., 1.0 slope, 0.0 intercept, value

我认为正确的解决方案是将这两个值类型化为 a FLOAT,但文档似乎不允许。我可以这样做DECIMAL,但是,我有一个问题,slope并且intercept可能是一个广泛的价值观。

我可以投slope吗?如果不是,最好的解决方案是什么?interceptFLOAT

4

1 回答 1

0

认为UNION小人,不是WITHUNION喜欢根据第一个来定义数据类型 SELECT。当然,使用WITH RECURSIVE,您没有交换SELECTs.

所以......我投票支持你的 0.0 和 1.0 的“黑客解决方案”。或者,这些可能更清楚:0e0 和 1e0。(仍然是一个杂物,但它指向FLOAT,而不是DECIMAL。)

我也对没有CASTingto FLOAT(or DOUBLE) 感到遗憾。

于 2018-05-10T01:11:45.823 回答