如何将数字范围映射到 SQL Server 或 Clickhouse 中的数字

Posted

技术标签:

【中文标题】如何将数字范围映射到 SQL Server 或 Clickhouse 中的数字【英文标题】:How to map number ranges to numbers in SQL Server or 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) 【参考方案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 

【讨论】:

以上是关于如何将数字范围映射到 SQL Server 或 Clickhouse 中的数字的主要内容,如果未能解决你的问题,请参考以下文章

将数字重新映射到pygame中的另一个范围[重复]

本地化:如何将文化信息映射到脚本名称或 Unicode 字符范围?

SQL Server - 在按特定列分组时构建动态范围的数字

如何将非统一的 int 范围映射到 C# 中的某些字符串值?

如何合并 SQL Server 中具有映射到通用描述的不同列标题的表?

ODI:SQL Server源代码