现有两张表
一张表为数量表(上万数据)
甲 1233
乙 2233
丙 3233
丁 4233另一张为区间表      (此处为二维表描述,可根据实际改一维表)
甲   500内 为等级A,500-1000 等级 B  1000-1500等级C 1500以上等级D
乙  500内 为等级A,500-1500 等级 B  1500-2000等级C 2500以上等级D
丙   1000内 为等级A,1000-2000 等级 B  2000以上上等级D     (注意,无C)
丁  1000内 为等级A,1000-3000 等级 B  3000以上上等级C
  
如何匹配出
甲    等级B
乙    等级C
丙   等级D
丁  等级C大家动动脑子,我已经想了好多天了......

解决方案 »

  1.   

    其实就是执行差不多excel中frequency这个函数的
      

  2.   

    区间表结构是
    名称 等级 开始数量 结束数量
    甲 等级A NULL 500select * from 数量表 as a, 区间表 as b
    where a.名称 = b.名称 and a.数量 >=ifnull(b.开始数量,a.数量) and a.数量 < ifnull(b.结束数量, a.数量+1)
      

  3.   

    楼上的做法可以实现,查询效率可以再改善一下。
    数量表不变。修改区间表,四个字段:
    分类(甲乙丙丁...),等级名称(ABC...), 等级区间下限(第一个等级可以设置为最小可能值,比如-1),等级区间上限(最后一个区间设置为最大可能值,比如999999)
    伪码供参考:SELECT quant.分类, rang.等级名称
    -- 此处用LEFT JOIN,防止异常值超出 上下限
    FROM 数量表 quant LEFT JOIN 区间表 rang ON quant.分类 = rang.分类
    WHERE quant.数量 >= rang.下限 AND quant.数量 < rang.上限这么修改,估计查询速度至少可以提高一个数量级。
      

  4.   

    各位大神说的都有道理给我了一定的启发我最后定下来,用的是存储过程设置一个阙值,判断是否大于阙值比如
    区间表      (此处为二维表描述,可根据实际改一维表)
    甲   500内 为等级A,500-1000 等级 B  1000-1500等级C 1500以上等级D我就设定一维表
    甲 等级A 0
    甲 等级B 500
    甲 等级C 1000然后
    数量表开始判断所有数值
    从1开始 到区间表最高等级,循环
    比如 甲 833   
    第一步,数值大于0 成立 为A
    下一步判断,数值大于500 成立 为B
    下一步判断,数值大于1000 不成立  
    结束循环
    发现速度也还行,200多w行。我这样做的想法是,最怕用户会写错区间,比如等级A 0-500,等级B 写了450-1000,这样类似477这样的就可能判断错大神们,看看,这样可行吗?有什么硬伤