如何解决了解带有浮点数的递归 cte
我想创建一些数据的直方图,但我使用的工具没有直方图工具,只有条形图工具。因此,我需要填补空白并自己创建垃圾箱。我正在尝试使用递归 cte 和左连接(对 sql 来说很新,所以如果术语不正确,请道歉)。我似乎可以用整数做我想做的事,但在我移动到实数时遇到问题。
我在下面解释了四个例子。
-
生成一个从 0 到 500 步长为 1 的 n 表没问题,基本上是我想要的,除了一个从 0 到 50 步长为 0.1 的表。
-
一旦我使用 n>=10,它就不再起作用了。
-
在 SELECT 语句中,我使用 0,而不是 0.0。不起作用。
问题:
- 如何生成一个表,其中 n 的行从 0 到 50,步长为 0.1?
- 为什么我必须在步骤中根据需要在 SELECT x 中使用尽可能多的小数?对于 0.1 的步长,我需要输入 0.0,对于 0.01,我需要输入 0.00。
注意事项:
-
我知道直方图不应该真的有 501 个 bin,但数据有 几个有趣的部分,所以它被用来“放大”到特定的区域。
-
我已经看到递归的限制为 1 000 行,但这低于 从而不理解错误。
1.Works(返回 501 行):
WITH RECURSIVE cte1 (n) AS
(
SELECT 0
UNION ALL
SELECT n + 1 FROM cte1 WHERE n < 500
)
SELECT * FROM cte1;
2.Works(返回 91 行:
WITH RECURSIVE cte1 (n) AS
(
SELECT 0.0
UNION ALL
SELECT n + 0.1 FROM cte1 WHERE n < 9
)
SELECT * FROM cte1;
3.不起作用(响应 Error Code: 1264. Out of range value for column 'n' at row 1
):
WITH RECURSIVE cte1 (n) AS
(
SELECT 0.0
UNION ALL
SELECT n + 0.1 FROM cte1 WHERE n < 10
)
SELECT * FROM cte1;
4.不起作用(响应 Error Code: 3636. Recursive query aborted after 1001 iterations. Try increasing @@cte_max_recursion_depth to a larger value.
):
WITH RECURSIVE cte1 (n) AS
(
SELECT 0
UNION ALL
SELECT n + 0.1 FROM cte1 WHERE n < 9
)
SELECT * FROM cte1;
解决方法
来自文档:
https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursive
CTE 结果列的类型是从列类型中推断出来的 仅非递归 SELECT 部分,列都是 可以为空。对于类型确定,递归 SELECT 部分是 忽略。
在您的情况下,它查看 SELECT 0.0
并假设它是 DECIMAL(2,1)
,这就是为什么它不允许在浮点之前或之后超过 1 位数字。
所以你需要给解析器一个你想要的类型的提示:
SELECT CAST(0 AS DECIMAL(3,1))
或 SELECT CAST(0 as float)
这样就行了。
希望这能回答您的两个问题。
更新。#4 不起作用,因为在每次迭代时,它将结果转换为整数,而 0 + 0.1 变为 0。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。