【问题标题】:By Groups in SAS vs window functions in SQL按 SAS 中的组与 SQL 中的窗口函数
【发布时间】: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=1final_Result is null 行上可能为真,这意味着您完全错过了该行。
  • 另外 - 更好的问题,感谢改进它。我建议还添加一些示例数据(输入数据)以及您认为输出数据应该是什么样子的示例。
  • 如果结果包含任何非数字字符,final_result 将为 null。我相信 SAS 代码中的“WHERE NOT MISSING(final_result)”行表明我们只选择 final_result 不为空的行,这相当于 sql @Joe

标签: sql hive sas hiveql window-functions


【解决方案1】:

我看到的唯一主要问题是,您可能会遇到最后一行的最终结果为空/缺失的问题。

在 SAS 中,where 子句发生在数据步骤处理之前,因此它实际上等同于将它放在 partition 语句中(我不确定这是否可能)和/或在更早的步骤中.如果按日期顺序的最后一行恰好为空,SAS 将跳过它并取最后一行 not 为空(因为它不会在开始的数据流中)。

但是,在您的 SQL 中,如果 rank=1 恰好有 final_result is null,它将被删除 - 但不会保留 rank=2 或任何行(因此您不会有 any em> 输出中该特定键/代码组合的行)。

select key, code, date, result, final_result 
from
(select s.*, 
 row_number() over (partition by key, code order by date desc) as rnk
 from (
   select *, cast(result as double) as final_Result
   from input_table 
   where final_Result is not null
   ) s
) x
where rnk=1

类似的东西应该是等​​价的。

我能看到的唯一其他潜在问题:如果您有两行日期完全相同,SAS 将选择输入数据集顺序中的“最后一个”行。我不知道 Hive 会做什么;但是,在大多数 SQL 实现中,您应该假设您会随机获得一个,因为 SQL 不会尝试保留行顺序。

【讨论】:

  • 谢谢,这个回复很有帮助。但是,关于 SQL 不保留行顺序的最后一部分,这是否意味着真的没有办法让 hiveql 与 sas 100% 匹配? @乔
  • 总是有可能的,只是可能需要更多的工作。实际上,您是否有两个键代码行具有相同(完全)date 值的行?另外,根据我对您较早问题的记忆,这些表首先是由 SQL 构建的;所以行顺序可能并不重要。 (直接的select 通常会保留行顺序,尽管并不总是存在;尽管分区可以做各种各样的事情,包括二叉树等,这可能会导致行顺序遍布整个地方。)跨度>
  • 但是你总是可以在开始时创建一个行顺序变量,如果没有别的,即 row_number 或任何 Hive 的等价物,然后基于 max(that) 进行选择。
  • 我会注意,我并不特别了解 Hive - 一般只是 SQL - 所以值得寻找有关 Hive 的特定信息(保留行顺序)。 Hive 似乎在这方面可能有一些特定的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多