我有一个包含以下列和数据的表。我需要在此表上应用一组规则,并在输出中获取记录。
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中进行查询。
答案 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;