HIVE/Impala 查询:计算满足特定条件的行之间的行数

Posted

技术标签:

【中文标题】HIVE/Impala 查询:计算满足特定条件的行之间的行数【英文标题】:HIVE/Impala query: Count the number of rows between rows fulfilling certain conditions 【发布时间】:2017-11-13 10:41:06 【问题描述】:

我需要计算满足某些条件的行数,这些条件包含在满足其他条件的其他行定义的间隔中。示例:满足条件 'Other_condition' = b 且具有值 1 和 4 的 'Reference' 之间的行数 N 为 N=1,具有值 2 和 5 且满足条件 'Other_condition 的'Reference' 之间的行数 N ' = b 是 N=2 等等。

  Date          Reference    Other_condition
20171111            1              a
20171112            2              a   
20171113            3              b
20171114            4              b  
20171115            5              b

我正在通过 Hive/Impala SQL 查询访问数据库,不幸的是我不知道从哪里开始实现这样的窗口函数。我想要的半伪代码版本是这样的:

SELECT COUNT (DISTINCT database.Date) AS counter, Other_condition, reference
FROM database
WHERE database.Other_condition = a AND database.Reference BETWEEN 
(window function condition 1: database.Reference = 2) AND 
(window function condition 2: database.Reference = 5)
GROUP BY counter

【问题讨论】:

你能发布这两个查询的预期输出吗?尤其是我不明白the condition 'Other_condition' = b is one的部分 @RadimBača 我已经编辑了这个问题,希望现在更清楚一点。一位同事向我展示了如何解决问题,但我需要一些时间才能理解代码,然后才能在这里提供明确的答案。 所以您正在寻找每个组满足条件的组数,即您在参考列中有一个 b 值行介于 1 和 4 之间? @RadimBača 准确地说。 【参考方案1】:

您的问题很难理解。我得到第一个条件,即“1”和“4”之间的行数。

这是一种很容易概括的方法:

select (max(case when reference = 4 then seqnum end) -
        max(case when reference = 1 then seqnum end)
       ) as num_rows_1_4
from (select t.*,
             row_number() over (order by date) as seqnum
      from t
     ) t;

【讨论】:

以上是关于HIVE/Impala 查询:计算满足特定条件的行之间的行数的主要内容,如果未能解决你的问题,请参考以下文章

Sql

如何摆脱 Hive/Impala 中的重复计数

如何返回满足特定条件的行列表以及它之前的行?

获取数据表中满足特定条件的行数

如何使不满足特定条件的行不出现在结果中

只读大文本文件中满足特定条件的行