如果我需要大约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]
但这个过程会耗费时间吗?还有其他一些方法可以做到吗?
答案 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