Генерация ряда диапазонов для случайного набора значений - PullRequest
2 голосов
/ 19 февраля 2009

Учитывая набор случайных числовых значений в базе данных, как мне создать ограниченный список диапазонов, где каждый диапазон содержит хотя бы одно значение? Диапазоны не должны перекрываться и в идеале иметь одинаковое количество значений в них. В идеале их границы также должны быть кратны 10, 100, 1000 и т. Д. *

Например:

Values: 100,150,180,300,400,500,600,650,700
results in
4 ranges: 100-180(2), 180-300(1), 300-600(3), 600-800(3)

Как это можно сделать в C # или T-SQL?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2009

В 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
0 голосов
/ 19 февраля 2009

Предположим, нам нужны диапазоны с одним значением в каждом: Значения: 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)
...