Sql 从列创建存储箱的案例替代方案

Sql 从列创建存储箱的案例替代方案,sql,hive,hiveql,Sql,Hive,Hiveql,我有一个表,其中列(COL1)的值可以从0到1(包括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 &g

我有一个表,其中列(
COL1
)的值可以从0到1(包括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
选择

当COL1 0.2和COL1 0.8以及COL1时,这里有一种方法可以做到这一点。如果假设您希望箱子范围为0.1,0.2,0.3,。。。直到1点。然后,您将使用块行生成并将步长设置为行数/10,以及为每个箱子设置下限和上限,生成10行

之后,您需要检查col1的值是否符合相应的bin下限和上限,如下所示。(我使用left join来包含col1值为null的条件。如果不可能出现这种情况,则可以将其更改为常规join)


我不确定Hive是否有装箱功能(Postgres有)。但你可以使用算术:

select floor( greatest(least($maxval, col1), $minval) - $minval) /
              $step_size
            ) as bin
from t;
如果要从数据中获取最小值和最大值,可以使用窗口函数:

select floor( greatest(least(maxval, col1), minval) - minval) /
              $step_size
            ) as bin
from (select t.*,
             min(col1) over () as minval,
             max(col1) over () as maxval
      from t
     ) t;

严格来说,计算不需要子查询。但这允许使用
bin
进行聚合。

创建一个表
(valueFrom、valueTo、bin\u value)
,并将其加入到查询中。如果这个关系是线性的,你可以用简单的算术表达式来代替。这不是一个纯粹的数学映射吗?为什么不在你的应用程序中使用它呢?不知道你的意思。乔治·约瑟夫(George Joseph)的以下答案在经过一些轻微调整后生效(将提供建议的调整,然后接受他的答案),如果您有一个更简单/更清晰的简单算法替代方案,我很乐意听到。太好了。由于HiveQL中显然不存在
top
功能,并且由于四舍五入,在某些情况下箱子稍微不正确(例如,0.1999998而不是0.2),因此需要进行轻微调整。此外,我无法使用BETWEEN执行连接,因此我将其改为where语句。您的查询在下一篇评论中稍作修改,并对您的答案进行了稍作修改,以适应Hive QL。这似乎比先前提出的答案快得多,而且它可能可以在任何SQL变体中实现。我对您的查询做了一点修改:
选择ceil(最大值(col1,0.01)/0.01)作为bin
。这样所有的价值观
select floor( greatest(least(maxval, col1), minval) - minval) /
              $step_size
            ) as bin
from (select t.*,
             min(col1) over () as minval,
             max(col1) over () as maxval
      from t
     ) t;