2

バンドを動的に生成したいので、それをレポートにグループ化します。

私が最初に考えたのは、最小値と最大値を取り、その差を除算してバンドを生成することでした。

たとえば、大勢の人の給料があるとします。

  • 最低支払額は年間12,000ポンド、最高額は3,000,000ポンドです。
  • だから私はそれを同じようなサイズの10のバンドに分割しました:(£3mill-£12k)/10=£298800
  • だから私の最初のバンドは£12kから£310,800になり、何千人もの人々が参加します
  • 私の2番目のバンドは£31万から£61万になり、数百を持っています
  • 他のすべてのバンドには、それぞれに数人がいます

したがって、これは実際にはあまり役に立ちません。手動でバンドを作成する場合は、それぞれにほぼ同じ数が必要です。たとえば、£12k-£14k、£14k-£18k、£18k-£25k、£25-£35k、...、£ 150万〜300万ポンド

これはほんの一例です。さまざまなディストリビューションが存在する可能性があります。

バンドを生成するアルゴリズムを探しているので、ユーザーは必要なバンドの数を入力し、データはそれぞれに同じ数のバンドにグループ化されます。

バンディングは迅速である必要があります-データセット全体をループすることはできません。

アプリケーションはSQLの上にC#ですが、他の言語のソリューションも歓迎します。

4

4 に答える 4

3

NTILEを見たことがありますか?SQLServerとほとんどのdbmsはそれをサポートしています。

例えば:

select b.band, count(*), min(b.valuefield), max(b.valuefield)
from ( 
    select ntile(10) over (order by valuefield) as 'band', valuefield
    from table ) b
group by b.band
于 2010-12-23T15:54:40.243 に答える
2

あなたは間違った視点から問題を見ています。給与を見る代わりに、ソートされた給与の範囲内での人の順序付けられた位置を見てください。アルゴリズムを少し脇に置いて、数学的に考えてください。

すべての人を連れて、給料で並べ替えます。ここで、1からnまで順番に番号を付けます。これは、給与が最も高い最後の番号です。m個のグループが必要な場合、各グループにはn/m人が含まれます。したがって、最初の給与バンドは0からperson [n / m] .Salaryになり、2番目の給与バンドはそこからperson [2 * n /m].Salaryになります。

C#では、Linqでこれをかなり効率的に行うことができます。このようなもの。これはテストされていないコードです。これは最終的な解決策ではない概念です。おそらく、私が正しく考えていないエッジ状態の問題がいくつかあります。

List<int> GetBands(int numBands)
{
    using(var db = new MyContext())    
    {
        var list SalaryBands = new List<int>();
        var count = db.People.Count();
        var salaries = db.People.OrderBy(item => item.Salary)
                                .Select(item => item.Salary);
        int skipCount = count / numBands;
        for(int segmentNum = 0; segmentNum < numBands; segmentCount++)
        {
            salaries = salaries.Skip(skipCount);
            salaryBands.Add(salaries.First());
        }
        return salaryBands;
    }
}
于 2010-12-23T16:23:09.263 に答える
1

既存のデータセットを「バンド」にクエリする方法について質問していると思います...

これが当てはまる場合、Oracleはこの目的のためにNTILE集計関数をサポートします。他のSQL実装にも同等のものがあるはずです。

于 2010-12-23T15:53:23.893 に答える
0

最初の観察では、直線ではなく、対数のようなグラフが必要です。

2番目の観察:私は通常、(与えられた例に似た)大規模なサンプルデータセットを構築し、次に私の共通の要因を探し、実際のデータから公式システムを導き出します。さらにいくつかのシナリオを想定できますか?

于 2010-12-23T16:01:29.417 に答える