Impala 中的行号()

d7v8vwbk  于 2021-06-26  发布在  Impala
关注(0)|答案(4)|浏览(502)

我有一个用例需要在分区上使用row\u number():类似于:

SELECT
  Column1 , Column 2
  ROW_NUMBER() OVER (
    PARTITION BY ACCOUNT_NUM
    ORDER BY FREQ, MAN, MODEL) as LEVEL
FROM
  TEST_TABLE

我需要一个在 Impala 的解决办法。不幸的是,impala不支持子查询,也不支持row_number()over函数。谢谢你的帮助。

qybjjes1

qybjjes11#

cdh 5.2中添加了分区上的行数()
https://www.cloudera.com/documentation/enterprise/latest/topics/impala_analytic_functions.html#row_number

ROW_NUMBER() OVER([partition_by_clause] order_by_clause)
5t7ly7z5

5t7ly7z52#

Impala 现在支持over子句。语法与问题中的相同。

SELECT
  Column1 , Column 2
  ROW_NUMBER() OVER (
    PARTITION BY ACCOUNT_NUM
    ORDER BY FREQ, MAN, MODEL) as LEVEL
FROM
  TEST_TABLE

Impala 文献:https://www.cloudera.com/documentation/enterprise/5-6-x/topics/impala_analytic_functions.html#over

iklwldmw

iklwldmw3#

impala支持子查询。括号内和使用 with 功能。

h79rfbju

h79rfbju4#

对于这种类型的查询,impala相当有限。通过一些假设,可以进行此查询:
分区子句中的四列永远不会 NULL 分区子句中的四列唯一地标识一行
这个查询非常难看而且昂贵:

select tt.column1, tt.column2, count(*) as level
from test_table tt join
     test_table tt2
     on tt.account_num = tt2.account_num and
        (tt2.freq < tt.freq or
         tt2.freq = tt.freq and tt2.man < t.man or
         tt2.freq = tt.freq and tt2.man = t.man and tt2.model <= t.model
        )
group by tt.column1, tt.column2, tt.account_num, tt.freq, tt.man, tt.model;

相关问题