SQL中单列中的bin

表工

worker_id Salary 
    1  100000
    2  80000
    3  300000
    4  500000
    5  500000
    6  200000
    7  75000
    8  90000

我希望创建另一列salary_bin,如果薪水 < 80k,那么它应该是 bin 1,如果薪水在 80k 和 100k 之间,那么它将在 bin 2 中,如果薪水在 100k 和 300k 之间,那么它将是 bin3,如果薪水在 300k 到 500k 之间,那么它将是 bin 4。

试图:

alter table dbo.worker 
add salary_bin decimal(10,2) 
select worker_id, salary, 
case when salary>=0 and salary<80000 then salary_bin ='1',
case when salary>=80000 and salary<=100000 then salary_bin ='2',
case when salary>=100000 and salary<=300000 then salary_bin ='3',
case when salary>=300000 and salary<=500000 then salary_bin ='4
from Worker

错误:

'=' 附近的语法不正确。

有人可以帮忙吗?

回答

修复您的case表达式以使用正确的语法并删除表引用,因为计算列会自动引用您将其添加到的表,并且实际上不能引用另一个表(除非您使用缩放函数)。

同样要制作垃圾箱,您应该确保值之间没有重叠,即您不能让垃圾箱 <= 100,000 然后下一个垃圾箱 >= 100,000,因为它会落入第一个垃圾箱而您想要第二个垃圾箱。你需要表达式的一侧是>=,另一侧是 just <。并且您通常希望 anelse处理任何更高的值,例如 bin 5。

alter table dbo.worker 
add salary_bin as
case when salary >= 0 and salary < 80000 then 1
when salary >= 80000 and salary < 100000 then 2
when salary >= 100000 and salary < 300000 then 3
when salary >= 300000 and salary < 500000 then 4
else 5
end

注意:您不引用数值。

此外,因为case表达式在第一次匹配时停止,您可以通过将条件的顺序从大到小颠倒来简化,然后删除下限检查,如下所示:

alter table dbo.worker 
add salary_bin as
case when salary >= 300000 then 4
when salary >= 100000 then 3
when salary >= 80000 then 2
else 1
end

注意:这不能处理高于 500,000 的 bin,因为它没有指定,但可以很容易地扩展到这样做。

进一步:在指定 bins/buckets 时,表达式“between”不够精确,因为它没有指定开始和/或结束值是包含在范围内还是排除在范围内。人们应该总是使用“大于”、“大于等于”、“小于”、“小于等于”来完全清楚一个 bin 包含哪些值。


以上是SQL中单列中的bin的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>