理解带有浮点的递归cte



我想创建一些数据的直方图,但我使用的工具没有直方图工具,只有条形图工具。因此,我需要填补空白,自己创建垃圾箱。我正试图用递归cte和左联接来实现这一点(对于SQL来说是全新的,所以如果术语不正确,请道歉(。我似乎可以用整数做我想做的事,但当我转到实数时会遇到问题。

我在下面解释了四个例子。

  1. 生成一个n从0到500、步长为1的表没有问题,基本上是我想要的,除了一个步长为0.1、从0到50的表。

  2. 另一个步长为0.1的表,从0到9。效果很好,但不是我想要的范围。

  3. 一旦我使用n>10它已经不起作用了。

  4. 在SELECT语句中,我使用0,而不是0.0。不起作用。

问题:

  1. 如何生成一个表,其中n的行数从0到50,步长为0.1
  2. 为什么我必须在SELECT x中使用尽可能多的小数?对于步长为0.1,我需要输入0.0;对于步长为0.01,我需要键入0.00

备注:

  • 我知道直方图不应该有501个bin,但数据有几个有趣的部分,所以它习惯于";放大";到特定区域。

  • 我已经看到递归有1000行的限制,但这低于因此无法理解错误。

1.Works(返回501行(:

WITH RECURSIVE cte1 (n) AS
(
SELECT 0
UNION ALL
SELECT n + 1 FROM cte1 WHERE n < 500
)
SELECT * FROM cte1;

2.作品(返回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-表表达式递归

CTE结果列的类型是根据列类型推断的的非递归SELECT部分,并且列都是可以为null。对于类型确定,递归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。

相关内容

  • 没有找到相关文章

最新更新