0

範囲を定義する2つの数値列を持つ参照テーブルがあります。たとえば、アカウントの従業員と、会社の規模を取得する各従業員の範囲です。

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

...等々

パラメータを指定してSizeを返す必要があります。たとえば、110は「中」を返すとします.2番目の列は常に=最初の列+1です

上記のように 2 つの列を使用して 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。このように、最大​​サイズは、将来使用する可能性のある「特大」サイズに制限されません。

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

最小か最大かにかかわらず、私は間違いなく 1 つの列を使用します。とりわけ、これにより、範囲間にギャップがないことが保証されます。最大と仮定すると、テーブルは次のようになります。

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 に答える