0

我有一个包含两个数字列的参考表,它们定义了一个范围,例如一个帐户的员工,对于每个员工范围,我得到一个公司规模:

employeeMin   employeeMax   Size
1             100           small
101           2000          medium
2001          10000         medium-large
10001         100000        large

...等等

我需要在给定参数的情况下返回大小,比如 110 会返回“中等”,因为你看到第二列总是 = 第一列+1

所以我想知道用两列在上面的sql中实现它是否更好,或者我应该只使用employeeMax并且可能订购并返回第一条记录?我希望存在一种模式?也许自我加入或类似?我做了一些研究,但找不到...

4

3 回答 3

2

这一切都取决于您的目标,例如:

可维护性- 如果您不经常阅读或使用任何类型的优化(例如物化视图),请使用 1 列

employeeMax   Size
100           small
2000          medium
10000         medium-large
100000        large

select *
from accounts a
join (      
    select
        cs1.emploeeAbove,
        coalesce(min(cs2.emploeeAbove), 999999999) employeeMax,
        Size
    from company_sizes cs1
    left join company_sizes cs2
        on cs2.employeeAbove > cs1.employeeAbove
    group by cs1.employeeAbove, Size
) cs
    on a.emploees > cs.employeeAbove
    and a.employees <= cs.employeeMax

更快的连接- 如果您有数百万条记录并且您不知道如何优化以前的方法,请使用 2 列设计

employeeAbove   employeeMax   Size
0               100           small
100             2000          medium
2000            10000         medium-large
10000           100000        large

select *
from accounts a
join company_sizes cs
    on a.emploees > cs.employeeAbove
    and a.employees <= cs.employeeMax
于 2013-03-27T17:29:26.157 回答
0

我建议仅使用该employeeMin列,然后删除employeeMax. 这样,对于您将来可能拥有的“x-large”尺寸,最大尺寸是开放的。

 SELECT Size FROM yourtable WHERE employeeMin <= 110 ORDER BY employeeMin DESC LIMIT 1
于 2013-03-27T16:17:28.073 回答
0

我肯定会使用一列,无论是最小值还是最大值。除其他外,这可确保您的范围之间没有任何差距。假设最大值,您的表格将如下所示:

employeeMax   Size
100           small
2000          medium
10000         medium-large
100000        large

您获取实际范围的查询将类似于:

select 
     coalesce((select max(employeeMax) 
               from CompanySize b 
               where b.employeemax < a.employeemax),
              0) as employeeMin
     a.employeeMax, 
     a.size
from CompanySize

如果您的数据库支持分析功能,您可以稍微简化一下:

select 
     coalesce(lag(employeeMax) over (order by employeemax asc),
              0) as employeeMin
     a.employeeMax, 
     a.size
from CompanySize
于 2013-03-27T16:43:12.983 回答