如何将数字范围映射到 SQL 服务器或 Clickhouse 中的数字
How to map number ranges to numbers in SQL Server or Clickhouse
我的查询中有一个计算结果为浮点数。
我应该做的是将[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 行不通。那么,还有其他方法可以解决这个问题吗?
例如它会做的数据
Select lower_bound, upper_bound, (lower_bound + upper_bound)/2 shown_number
from mytable
解决方案:
SELECT FLOOR(N*200 -1)/200, N, CEILING(N * 200 + 1)/200
FROM T
试试这个:
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) │
└──────┴───────────────┘
*/
考虑到浮点数的比较近似。
我的查询中有一个计算结果为浮点数。
我应该做的是将[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 行不通。那么,还有其他方法可以解决这个问题吗?
例如它会做的数据
Select lower_bound, upper_bound, (lower_bound + upper_bound)/2 shown_number
from mytable
解决方案:
SELECT FLOOR(N*200 -1)/200, N, CEILING(N * 200 + 1)/200
FROM T
试试这个:
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) │
└──────┴───────────────┘
*/
考虑到浮点数的比较近似。