CASE声明中的大量WHEN条件(binning)

时间:2015-12-07 12:16:32

标签: sql sql-server sql-server-2008 tsql case

如果我需要大约100个垃圾箱,如何在SQL Server 2008中进行分箱?我需要根据binning变量是否属于100个相等间隔之一来对记录进行分组。 例如,如果有连续的变量年龄,我可以写:

CASE
   WHEN AGE >= 0 AND AGE < 1 THEN '1'
   WHEN AGE >= 1 AND AGE < 2 THEN '2'
   ...
   WHEN AGE >= 99 AND AGE < 100 THEN '100'
END [age_group]

但这个过程会耗费时间吗?还有其他一些方法可以做到吗?

5 个答案:

答案 0 :(得分:1)

尝试此代码一次:

SELECT CASE
         WHEN AGE = 0 THEN 1
         ELSE Ceiling([age])
       END [age_group]
FROM   @T 

这里CEILING函数返回大于或等于指定数值表达式的最小整数.i.e select CEILING(0.1)SQL返回1作为输出

但根据您的输出要求最低限额(年龄)+1足以获得所需输出。

SELECT Floor([age]) + 1 [age_group]
    FROM   @T 

Here Floor Function返回小于或等于指定数值表达式的最大整数。

答案 1 :(得分:0)

数学,我想。在这种情况下,

Ceiling(Age) AS [age_group]

根据需要投射到您选择的角色类型中。天花板是一个整数&#39; SQL Server中的函数。

答案 2 :(得分:0)

您可以使用算术来达到此目的。像这样:

select floor(bins * (age - minage) / (range + 1)), count(*)
from t cross join
     (select min(age) as minage, max(age) as maxage,
             1.0*(max(age) - min(age)) as range, 100 as bins
      from t
     ) m
group by floor(bins * (age - minage) / (range + 1))

但是,对于您的示例来说,这样做太过分了,根本不需要case

答案 3 :(得分:0)

如果您的组间隔是固定的 - 例如1200,您可以只进行整数除法以获得具有该分组的索引。

例如:

SELECT 1000 / 1200等于0
SELECT 2200 / 1200等于1
记住 - 如果你使用的是十进制数据类型,你需要转换为int来获得结果。整数除法需要运算符两边的int。

然后加1以获得组

答案 4 :(得分:0)

根据你对1200的细分评论来试试这个:

;With Number
AS
(
    SELECT * 
    FROM (Values(1),(2), (3), (4), (5), (6), (7), (8), (9), (10))N(x)
),
Segments
As
( 
    SELECT (ROW_NUMBER() OVER(ORDER BY Num1.x) -1) * 1200 As StartNum,
           ROW_NUMBER() OVER(ORDER BY Num1.x)  * 1200 As EndNum 
    FROM Number Num1
    CROSS APPLY Number Num2
)
SELECT *
FROM Segments
    SELECT *
    FROM Segments
    INNER JOIN MyTable
       ON MyTable.Price >= StartNum AND MyTable.Price < EndNum