sql - 在 Hive SQL 中引用计算列的输出

标签 sql sql-server hadoop hive

我在 Excel 中有一个自引用/递归计算需要移动到 Hive SQL。基本上,仅当具体列的总和加上先前计算的结果大于 0 时,该列才需要对两个值进行SUM

数据如下,A为值,B为预期输出:

|  A  |  B  |
|-----|-----|
|  -1 |  0  |
|  2  |  2  |
|  -2 |  0  |
|  2  |  2  |
|  2  |  4  |
|  -1 |  3  |
|  2  |  5  |

在 Excel 中,它将在 B 列中写为:

=MAX(0,B1+A2)

SQL 中的问题是你需要有当前计算的输出。我想我已经用 SQL 将其排序如下:

DECLARE @Numbers TABLE(A INT, Rn INT)

INSERT INTO @Numbers VALUES (-1,1),(2,2),(-2,3),(2,4),(2,5),(-1,6),(2,7);

WITH lagged AS
(
    SELECT A, 0 AS B, Rn
    FROM @Numbers
    WHERE Rn = 1

    UNION ALL

    SELECT i.A, 
        CASE WHEN ((i.A + l.B) >= 0) THEN (i.A + l.B)
            ELSE l.B
        END, 
        i.Rn
    FROM @Numbers i INNER JOIN lagged l
    ON i.Rn = l.Rn + 1
)
SELECT *
FROM lagged;

但这是 Hive,它不支持 CTE,所以我需要稍微简化 SQL。使用 LAG/LEAD 有可能吗?走到这一步,我的脑袋都疼了!

最佳答案

我最初认为,首先计算所有元素的总和直到每个排名,然后使用负元素以某种方式修复这些值会有所帮助。

但是,将 B 列清零的一个大负数将在总和中结转,并使所有后续元素都为负数。

正如 Gordon 评论的那样 - 0 是计算中的最大值 =MAX(0,B1+A2) 取决于它发生的先前位置并且似乎不可能提前分析计算它们.

关于sql - 在 Hive SQL 中引用计算列的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40348620/

相关文章:

php - 使用 if 语句检查记录是否存在 mysql/php

c# - 从 C# CLR 快速插入

google-app-engine - 部署 Hadoop 集群时出错(教程): The resource 'projects/project-id was not found

postgresql - Sqoop+PostgreSQL : how to prevent quotes around table name

mysql - 获取列中每个值的列表以及它出现的次数,从高到低排序

mysql - 为什么我会通过此连接获得笛卡尔项目?

sql - Postgres 将字符变化视为整数

python - pypyodbc:关键字 "WITH"附近的 OPENJSON 语法不正确

sql - SQL Server 上的 varbinary 到 string

hadoop - Spring Cloud Dataflow-http |卡夫卡和卡夫卡| hdfs-在HDFS中获取原始消息