【问题标题】:Understanding recursive cte with floats用浮点数理解递归 cte
【发布时间】:2021-06-23 10:01:54
【问题描述】:

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

我在这里解释了以下四个示例。

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

  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,但数据有 几个有趣的部分,所以它被用来“放大”到部分区域。

  • 我已经看到递归的限制为 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;

【问题讨论】:

    标签: mysql sql recursive-query mysql-8.0


    【解决方案1】:

    来自文档:

    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。

    【讨论】:

    • 另外 - 不精确的数据类型可能会产生不正确的结果。见fiddle,最后一个查询。
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    相关资源
    最近更新 更多