需要每个组选择最小值(eff_dt)和最大值(exp_dt)。 C1和C2列定义了一个组:对于每个不同的对(C1,C2),我需要具有min(eff_dt)和max(exp_dt)。 一个简单的group by此处无济于事,因为在出现时间“滞后”的情况下它不起作用:如果一条记录的(c1,c2)值相同但不在同一行,则结果将省略滞后之间的结果
这里是输入,所需输出和仅使用分组依据的输出的示例...
--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
答案 0 :(得分:0)
这是一个空白问题。行号的不同是一种方法:
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
值的相邻行。