sql - 替代 CASE WHEN 从列创建 bin
问题描述
我有一个表,其中列 ( COL1
) 的值可以从 0 到 1(含)。在本专栏中,我想创建一个COL1
使用预定义范围进行分类的新列(即创建箱)。当类别/箱的数量很少时,可以使用 轻松完成CASE WHEN
,例如:
SELECT
CASE WHEN COL1 <= 0.2 THEN 1
WHEN COL1 > 0.2 AND COL1 <= 0.4 THEN 2
....
WHEN COL1 > 0.8 AND COL1 <= 1 THEN 5
END AS COL1_bin
FROM Table
因为我想要 100 个 bin,所以我正在寻找一种使用函数更“自动”地执行此操作的方法,例如,我可以在其中给出最小值、最大值和 stepsize / binsize(例如,min = 0,max = 1 , 步长 = 0.01)
我在 HiveQL 中执行此操作,它应该与 MySQL 非常相似。
解决方案
这是一种方法。如果假设您希望 bin 范围为 0.1,0.2,0.3,... 直到 1。然后您将使用块 row_gen 并将 step_size 设置为 row_number/10 生成 10 行,并且还通过将 lower_limit 和 upper_limit 设置为每个垃圾箱。
之后,您需要检查 col1 的值是否符合 bin 的相应下限和上限,如下所示。(我使用左连接来包括 col1 值为空的那些条件。如果这不是可能的情况,则可以将其更改为常规连接)
with row_gen
as (select top 10
,row_number() over(order by 1) as bin_id
,row_number() over(order by 1)/10 as as lower_limit
,row_number() over(order by 1)/10 + 1/10 as as upper_limit
from table /*any table that has 10 rows*/
)
select a.*
,b.bin_id
from your_table a
left join row_gen b
on a.col1 between b.lower_rnk and b.upper_rnk
推荐阅读
- database - Google 表格 - 查询一个选项卡效果很好,但在向查询中添加第二个选项卡时出现值错误
- c# - 如何获取上次系统关机\开机时间(Win10)
- dynamic - 使用前日期动态切片的年龄分析
- asp.net - MVC Authenticate 重定向以使用参数登录
- javascript - 如何为一组相互依赖的任务构建异步等待代码?
- python - 编程可变间距以跨行对齐打印输出的元素
- amazon-web-services - 具有可见性超时扩展的 SQS Lambda 触发器
- javascript - scrollToIndex 超出范围:项目长度 0 但最小值为 1
- python - 我可以在选择时替换列值,然后将其用于与另一个表中的列值进行比较吗?
- amazon-web-services - 如何将 AWS Cognito 用作统一的 SSO?