2009-02-19 5 views
2

Étant donné un ensemble de valeurs numériques aléatoires dans une base de données, comment générer une liste limitée de plages où chaque plage contient au moins une valeur? Les plages ne doivent pas se chevaucher et, idéalement, avoir une quantité similaire de valeurs. Idéalement leurs limites devraient également être des multiples de 10, 100, 1000, etc ...Générer un nombre de plages pour un ensemble aléatoire de valeurs

Par exemple:

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)

Comment cela pourrait-il être fait en C# ou T-SQL?

Répondre

2

En 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 

Dans votre cas:

 
1 100 240 3 
2 240 450 2 
3 450 625 2 
4 625 700 2 
+0

Pouvez-vous faire en Linq? :) – AndyD

+0

Vous pouvez le faire dans une procédure stockée et l'appeler à partir de LINQ :) – Quassnoi

0

Supposons que nous voulons gammes avec une valeur en eux chacun: Valeurs: 100 150 180 300 produisent seulement ces nombres aléatoires:

- a: 0 <= 100, eg: 50 
- b: 100 <= 150, eg: 125 
- c: 150 <= 180, eg: 165 
- d: 180 <= 300, eg: 200 
- e: 300 <= , eg: 350 

...

Gammes: 50-125 (1), 125-180(1), 180-200(1), 200 - 350 (1) ...: chacune contient exactement un nombre.

maintenant d'avoir plus d'un numéro dans chaque plage, il suffit de commencer les numéros Skippin, par exemple sauter c (peut choisir un hasard de sauter un): sauter c:

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

Je suis sûr que si je reçois votre réponse ... pourriez-vous écrire un pseudo code pour votre algorithme? – AndyD

+0

En regardant encore ceci, cette réponse manque le point. J'ai déjà les valeurs (prix) dans la base de données et je veux une requête pour permettre à l'utilisateur de descendre dans une plage spécifique. – AndyD

Questions connexes