Impala SQL-选择条件中的多个条件

时间:2018-08-10 02:19:23

标签: sql impala

我有一个包含以下列和数据的表。我需要在此表上应用一组规则,并在输出中获取记录。

src_sys_nm  last_tmstp                 src_sys_id
CIT         2016-08-31 12:30:43.720     291289
CIT         2016-08-31 16:44:19.930     291289
UFE         2017-11-15 09:05:37.487     291289
UFE         2017-12-12 15:10:35.707     291289
CIT         2017-12-13 15:11:22:540     291289
EPRO        2018-06-19 12:25:23.053     259858
EPRO        2018-06-22 15:28:35.433     259858
UFE         2017-12-12 16:37:10.130     259858
EPRO        2017-12-13 15:11:22:540     259858
UFE         2017-11-15 09:05:37.487     359423111
UFE         2017-12-12 15:10:35.707     359423111
UFE         2017-12-12 16:37:10.130     359423111
CIT         2016-08-31 12:30:43.720     291287
CIT         2016-08-31 16:44:19.930     291287
EPRO        2018-06-19 12:25:23.053     391289
EPRO        2018-06-22 15:28:35.433     391289

规则1:报表上的记录在src_sys_id上应该是唯一的。

规则2:如果在src_sys_nm-UFE下存在具有相同src_sys_id的记录,则需要选择带有最新时间戳的UFE记录。

规则3:如果src_sys_nm下的src_sys_id记录-UFE和CIT,则需要选择带有最新时间戳的UFE记录。

规则4:如果在src_sys_nm下存在具有相同src_sys_id的记录-UFE和EPRO,则需要选择带有最新时间戳的UFE记录。

规则5:如果在src_sys_nm下存在具有相同src_sys_id的记录-CIT或EPRO,则需要选择具有最新时间戳的记录作为 CIT和EPRO。

基于这些规则的预期输出

src_sys_nm  last_tmstp                 src_sys_id
UFE         2017-12-12 15:10:35.707     291289
UFE         2017-12-12 16:37:10.130     259858
UFE         2017-12-12 16:37:10.130     359423111
CIT         2016-08-31 16:44:19.930     291287
EPRO        2018-06-22 15:28:35.433     391289

感谢您的帮助。我需要在Impala SQL中进行查询。

1 个答案:

答案 0 :(得分:0)

可以通过src_sys_id在两个不同的部分中执行逻辑。当我们在小组中有UFE以及什么时候没有

-- when we do have UFE in the group we order order by src_sys_nm letting UFE first and timestamp
select src_sys_nm, last_tmstp, src_sys_id from (
select 
*,
MAX(case when 'UFE' = src_sys_nm then 1 else 0 end) over (PARTITION BY src_sys_id) as ufe_in_group,
ROW_NUMBER() over (PARTITION BY src_sys_id order by (case when 'UFE' = src_sys_nm then 1 else 0 end) desc,  last_tmstp desc) as position
from t30
) t  where ufe_in_group = 1 and position = 1
union all
-- when we do not have UFE en group we simply group by src_sys_id and src_sys_nm and order by timestamp
select src_sys_nm, last_tmstp, src_sys_id from (
select *, ROW_NUMBER() over (PARTITION BY src_sys_id, src_sys_nm order by last_tmstp desc) as position
 from (
select 
*,
MAX(case when 'UFE' = src_sys_nm then 1 else 0 end) over (PARTITION BY src_sys_id) as ufe_in_group
from t30
) t  where ufe_in_group = 0 
) t2 where position = 1;