给定数据库中的一组随机数值,如何生成一个有限的范围列表,其中每个范围至少包含一个值?这些范围不应重叠,并且理想情况下它们中的值数量相似。理想情况下,它们的边界也应该是 10、100、1000 等的倍数......
例如:
值:100,150,180,300,400,500,600,650,700 结果是 4 个范围:100-180(2)、180-300(1)、300-600(3)、600-800(3)
这如何在 C# 或 T-SQL 中完成?
在MS SQL 2005+
:
SELECT range, (MIN(getprev) + MIN(value)) / 2 as range_start, (MAX(getnext) + MAX(value)) / 2 AS range_end, COUNT(*) as range_values
FROM (
SELECT value,
NTILE(4) OVER (ORDER BY value ) AS range,
(
SELECT TOP 1 value
FROM values li
WHERE li.value < lo.value
ORDER BY
li.value DESC
) AS getprev,
(
SELECT TOP 1 value
FROM values li
WHERE li.value > lo.value
ORDER BY
li.value
) AS getnext
FROM values lo
) vo
GROUP BY range
ORDER BY range
在你的情况下:
1 100 240 3 2 240 450 2 3 450 625 2 4 625 700 2
假设我们想要每个范围都有一个值: 值:100 150 180 300 只需生成这些随机数:
- a: 0 <= 100, eg: 50
- b: 100 <= 150, eg: 125
- c: 150 <= 180, eg: 165
- d: 180 <= 300, eg: 200
- e: 300 <= , eg: 350
...
范围::
50-125 (1), 125-180(1), 180-200(1), 200 - 350 (1) ...
每一个都包含一个数字。
现在要在每个范围内有多个数字,只需开始跳过数字,例如跳过 c(可以随机选择跳过一个):跳过 c:
50-125(1), 125-200(2), 200-350(1)