【发布时间】:2015-08-05 15:35:14
【问题描述】:
我有一个表 input_table,其中包含以下列:
key - double
code - string
date- string
result -string
我有以下 SAS 代码:
PROC SQL;
CREATE TABLE t1 AS
SELECT key, code, date, result
from input_table
ORDER BY key, code, date;
QUIT;
DATA t1;
SET t1;
final_result= INPUT(result, 5.)
RUN;
DATA t2;
SET t1;
WHERE NOT MISSING(final_result)
BY key, code, date
IF LAST.code;
RUN;
因此,据我了解,此代码添加了列“final_result”,该列将结果转换为数值,如果包含非数值,则为 NULL。然后它为每个键、代码对选择具有最大日期的行。我试图在 hiveQL 中复制它(我认为这与这种情况下的 SQL 几乎相同):
select key, code, date, result, final_result
from
(select *,
row_number() over (partition by key, code order by date desc) as rnk,
cast(result as double) as final_result
from input_table
) x
where rnk=1 and final_result is not null
这个查询是否等同于上面的 SAS 代码? (我会测试自己,但目前遇到环境问题)
【问题讨论】:
-
final_result是否曾经为空?如果是这样,那么一个问题可能是您在外部查询中将其限制为不为空 - 因此rnk=1在final_Result is null行上可能为真,这意味着您完全错过了该行。 -
另外 - 更好的问题,感谢改进它。我建议还添加一些示例数据(输入数据)以及您认为输出数据应该是什么样子的示例。
-
如果结果包含任何非数字字符,final_result 将为 null。我相信 SAS 代码中的“WHERE NOT MISSING(final_result)”行表明我们只选择 final_result 不为空的行,这相当于 sql @Joe
标签: sql hive sas hiveql window-functions