2

データベース内の一連のランダムな数値が与えられた場合、各範囲に少なくとも 1 つの値が含まれる限定された範囲のリストを生成するにはどうすればよいですか? 範囲は重複してはならず、理想的にはそれらの範囲内に同様の量の値が含まれている必要があります。理想的には、それらの境界も 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 で行うにはどうすればよいでしょうか?

4

2 に答える 2

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
于 2009-02-19T14:14:48.463 に答える
0

それぞれに 1 つの値を含む範囲が必要であると仮定します: 値: 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) ...: それぞれに正確に 1 つの数値が含まれます。

各範囲に複数の数字を含めるには、skipin 数字を開始します。たとえば、skip c (スキップするチャンスをランダムに選択できます): skip c:

50-125(1), 125-200(2), 200-350(1)
于 2009-02-19T14:15:22.580 に答える