【问题标题】:How to map number ranges to numbers in SQL Server or Clickhouse如何将数字范围映射到 SQL Server 或 Clickhouse 中的数字
【发布时间】:2021-08-30 13:02:34
【问题描述】:

我的查询中有一个计算结果为浮点数。
我应该做的是将 [x-0.005,x+0.005) 的每个范围映射到 x。
例如:

shown number lower bound upper bound
0.12 0.115 0.125
0.17 0.165 0.175
0.18 0.175 0.185

这些范围很多,因此 CASE/WHEN 不起作用。那么,有没有其他方法可以解决这个问题?

【问题讨论】:

  • 我认为您需要提供一些示例数据和所需的结果,特别是因为 12.5 和 13.5 不是 0.xx
  • 你是对的,对不起我的问题。我更正了数字并添加了一个表格@Stu
  • 根据您的要求,0.125 应该映射到什么:0.12 还是 0.13?因为它与两者的距离为 0.005。
  • 所以您的“显示数字”只是您的(下限 + 上限)/2... - 这就是您要寻找的答案吗?
  • 看起来你需要简单的数学舍入:round(some_value, 2)

标签: sql clickhouse


【解决方案1】:

试试这个:

WITH
    0.005 AS step,    
    (
        SELECT groupArray(ranges)
        FROM 
        (
            /* Emulate the Ranges-table. */
            SELECT arrayJoin([(0.115, 0.125), (0.165, 0.175), (0.175, 0.185)]) AS ranges
        )
    ) AS ranges
SELECT
    x,
    arrayFirst(range -> x >= range.1 - step AND x < range.2 + step, ranges) AS range
FROM 
(
    /* Emulate the test table. */
    SELECT arrayJoin([0.12, 0.17, 0.18, 0.99]) AS x
)

/*
┌────x─┬─range─────────┐
│ 0.12 │ (0.115,0.125) │
│ 0.17 │ (0.165,0.175) │
│ 0.18 │ (0.175,0.185) │
│ 0.99 │ (0,0)         │
└──────┴───────────────┘
*/

考虑到浮点数的比较是近似的

【讨论】:

    【解决方案2】:

    例如它会做的数据

    Select lower_bound, upper_bound, (lower_bound + upper_bound)/2 shown_number
    from mytable
    

    【讨论】:

    • 我认为下限和上限是 OP 正在寻找的。​​span>
    • 标题说将数字范围映射到数字,反之亦然,完全不清楚。
    【解决方案3】:

    解决方案:

    SELECT FLOOR(N*200 -1)/200, N, CEILING(N * 200 + 1)/200
    FROM   T 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多