我想动态生成频段,然后将其分组为报告。

我的第一个想法是通过获取最小值和最大值,然后将差异划分来生成频段。

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

  • 最低薪水每年赚12,000英镑,最高收入为3,000,000英镑
  • 因此,我将其分成10个相似大小的乐队:(£3Mill-£12k) / 10 =£298800
  • 因此,我的第一支乐队的£12k至310,800英镑,其中有成千上万的人
  • 我的第二支乐队的£310k至61万英镑,有几百
  • 每个乐队中的每个乐队都有几个人

因此,这实际上并不是很有用。如果我要手动创建乐队,我想要每个数字,例如:12k-£14k,£14k-£18k,£18k-£25k-£25k,£25-£35k,...,...,£ 1.5-英镑300万英镑

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

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

乐队需要快速 - 我不能仅循环整个数据集。

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

有帮助吗?

解决方案

我认为您正在问如何查询现有数据集中的“频段” ...

如果这是正确的,则Oracle支持ntile聚合功能,以实现目的。其他SQL实现中应该有等效物。

其他提示

你看过吗 ntile? SQL Server和大多数DBM都支持它。

例如:

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

从错误的角度来看,您正在查看问题。而不是看工资看在各种薪水范围内的人的有序位置。将算法搁置一秒钟,然后数学上考虑它。

带走所有的人,并通过薪水对他们进行分类。现在,将它们依次从1个到N,是最高工资的最后一个。如果您需要M组,则每个组都包含N/M人。因此,第一个薪水带从0到人[n/m]。萨拉里,第二个薪水从那里开始到那里[2*n/m]。萨尔里等等。

在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;
    }
}

首先观察,您想要一个类似日志的图,而不是直线性。

第二个观察结果:我通常构建大型样本数据集(类似于您给定的示例),然后寻找我的常见因素,并从实际数据中得出公式化系统。您可以提出更多场景吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top