每组需要选择最小值(eff\u dt)和最大值(exp\u dt)。一个组是由列c1和c2定义的:对于每个不同的耦合(c1,c2),我需要有min(eff\u dt)和max(exp\u dt)。一个简单的groupby在这里是没有帮助的,因为它在“lag”的情况下不起作用:如果一个记录有相同的(c1,c2)值,但不是在一行中,结果将忽略中间的lag
这里是一个输入,期望输出和输出的例子,只使用分组方式。。。
--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
1条答案
按热度按时间csbfibhn1#
这是一个缺口和岛屿问题。行号不同是一种方法:
为什么这样做有点难解释。我发现,如果您查看子查询中的结果,您将看到值之间的差异如何标识具有相同属性的相邻行
c1
/c2
价值观。