2

我想动态生成乐队,然后将其分组在报告中。

我的第一个想法是通过取最小值和最大值然后除以差异来生成波段。

例如,假设您有一大群人的薪水:

  • 最低工资的年收入为 12,000 英镑,最高的收入为 3,000,000 英镑
  • 所以我把它分成 10 个类似大小的乐队:(3 百万英镑 - 1.2 万英镑)/ 10 = 298800 英镑
  • 所以我的第一支乐队从 12,000 英镑到 310,800 英镑,并吸引了成千上万的人
  • 我的第二支乐队从 31 万英镑到 61 万英镑,有几百个
  • 每个其他乐队都有几个人

那么这实际上并不是很有用。如果我要手动创建乐队,我希望每个乐队的数字大致相似,例如:£12k-£14k、£14k-£18k、£18k-£25k、£25-£35k、...、£ 1.5-300万英镑

这只是一个例子——可能有很多不同的分布。

我正在寻找一种算法来生成波段,因此用户将输入他们想要的波段数,并且数据将被分组到每个波段相似的数字中。

条带需要快速 - 我不能只循环整个数据集。

该应用程序是基于 SQL 的 C#,但欢迎使用其他语言的解决方案。

4

4 回答 4

3

你看过NTILE吗?SQL Server 和大多数 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,第二个从那里到 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

首先观察,你想要一个类似对数的图表,而不是直线。

第二个观察:我通常会构建大型样本数据集(类似于您给定的示例),然后寻找我的共同因素并从实际数据中得出一个公式系统。你能假设更多的场景吗?

于 2010-12-23T16:01:29.417 回答