如何将数字范围映射到 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 中的数字的主要内容,如果未能解决你的问题,请参考以下文章
本地化:如何将文化信息映射到脚本名称或 Unicode 字符范围?
SQL Server - 在按特定列分组时构建动态范围的数字
如何将非统一的 int 范围映射到 C# 中的某些字符串值?