2009-02-19 5 views
2

Учитывая набор случайных числовых значений в базе данных, как мне создать ограниченный список диапазонов, где каждый диапазон содержит хотя бы одно значение? Диапазоны не должны перекрываться и в идеале иметь одинаковое количество значений. В идеале их границы должны быть кратны 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

В 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

Вы можете сделать это в Linq? :) – AndyD

+0

Вы можете сделать это в хранимой процедуре и вызвать ее из LINQ :) – Quassnoi

0

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

Теперь, чтобы иметь более одного числа в каждом диапазоне, просто начните skippin числа, например, пропустить с (можно выбрать случайный шанс пропустить один): пропустить с:

50-125(1), 125-200(2), 200-350(1) 
+0

Я уверен, если я получу ваш ответ ... не могли бы вы написать какой-нибудь псевдокод для вашего алгоритма? – AndyD

+0

Глядя на это снова, этот ответ промахивается. У меня уже есть значения (цены) в базе данных и вы хотите, чтобы запрос позволял пользователю переходить к определенному диапазону. – AndyD

Смежные вопросы