【问题标题】:Impala 2.11 :AnalysisException: Subqueries are not supported in the select listImpala 2.11:AnalysisException:选择列表中不支持子查询
【发布时间】:2019-11-14 20:23:47
【问题描述】:

需要为每个组选择 min(eff_dt) 和 max(exp_dt)。 一个组由 C1 和 C2 列定义:对于每个不同的对 (C1,C2) ,我需要具有 min(eff_dt) 和 max(exp_dt)。 一个简单的 group by 在这里没有帮助,因为它在时间“滞后”的情况下不起作用:如果记录将具有相同的 (c1,c2) 值但不是连续的,结果将省略中间滞后

这里是输入、期望输出和仅使用 group by 输出的示例...

--INPUT                              --DESIRED OUTPUT                     --OUTPUT of SIMPLE GROUP BY
------------------------------------------------------------------------------------------------------------ 
C1  C2  EFF_DT      EXP_DT           C1   C2  Eff_dt      EXP_DT          C1   C2  EFF_DT       EXP_DT
4   8   2013-11-30  2014-01-22       4    8   2013-11-30  2014-01-22      4    8   2013-11-30   2999-12-31
2   8   2014-01-23  2014-01-23       2    8   2014-01-23  2014-01-23      2    8   2014-01-23   2014-01-23
4   8   2014-01-24  2015-12-31       4    8   2014-01-24  2999-12-31
4   8   2016-01-01  2016-12-31
4   8   2017-01-01  2018-03-15
4   8   2018-03-16  2018-07-24
4   8   2018-07-25  2999-12-31

尝试在 select 语句中使用子查询来根据当前行选择 max(exp_dt),但由于 impala 不支持它,所以没有工作.....

这是我尝试过的查询,它工作正常,但在 Impala 中却不行

SELECT    
     T0.C1,
     T0.C2,
     MIN(T0.EFF_DT) AS MIN_EFF_DT,
     T0.EXP_DT
FROM (
    SELECT 
    T1.C1,
    T1.C2,
    T1.EFF_DT,
    (
        SELECT MAX(T2.EXP_DT)
        FROM (select * from TABLE_NAME ) T2
        WHERE T2.C1 = T1.C1
        AND   T2.C2 = T1.C2
        AND NOT EXISTS (
        SELECT 1 FROM (select * from TABLE_NAME) T3
            WHERE T3.EXP_DT < T2.EXP_DT 
            AND   T3.EXP_DT > T1.EXP_DT
            AND  (T3.C1 <> T2.C1 OR T3.C2 <> T2.C2 )
        )

    ) EXP_DT
    FROM (select * from TABLE_NAME) T1
) T0 
GROUP BY 
T0.C1,
T0.C2,
T0.EXP_DT
ORDER BY MIN_EFF_DT ASC

【问题讨论】:

  • 您的查询呢?

标签: sql select subquery impala


【解决方案1】:

这是一个孤岛问题。行号不同是一种方法:

select c1, c2, min(eff_dt), max(exp_dt)
from (select t.*,
             row_number() over (order by eff_dt) as seqnum,
             row_number() over (partition by c1, c2 order by eff_dt) as seqnum_1
      from t
     ) t
group by c1, c2, (seqnum - seqnum_1);

为什么这行得通有点难以解释。我发现如果您查看子查询中的结果,您将看到值之间的差异如何识别具有相同 c1/c2 值的相邻行。

【讨论】:

  • 感谢您的建议。它适用于我拥有的一小部分数据。当我对整个表(〜500M行,其中一对(C1,C2)是一组更大的列(C1,C2,...,C8)运行它时,它需要永远......没有任何结果...... .
  • @SnowWhite 。 . .我建议您问另一个 问题,并提供更接近您实际使用的数据的清晰描述——以及问题的规模。我可以想到不同的解决方案,但我不知道哪个适用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多