sql - 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,因为它会落在第一个垃圾箱中,而您想要第二个垃圾箱。你需要表达的一侧是>=
,而另一侧是公正的<
。而且您通常希望 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 包含哪些值。
推荐阅读
- neo4j - 嵌入式 Neo4j APOC 程序 apoc.load.json 不工作
- redis - RediSearch Suggestions - 删除所有建议
- amazon-web-services - 返回 Amazon DynamoDB 属性的子集
- python - 如何保留数据框连接中的所有关键列
- jupyter-notebook - 有没有办法保存已执行的包含所有功能和数据的 Jupyter 笔记本?
- javascript - TypeScript 中的具体 Pick 实现
- javascript - 仅在 Safari 中:ReferenceError 找不到变量
- c# - 线程安全工厂
- selenium - 打印下拉元素值的所有隐藏定位器,并一一选择 react bootstrap
- python - 与邮递员一起使用时,无法通过使用 python 请求库调用 API 来获取正确的数据