使用分组查找缺少的记录

fumotvh3  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(341)

我正在努力实现sql查询,以便根据分组场景从2个配置单元表中识别丢失的记录。数据如下
表1-日历

month_last_day
20190131
20190229
20190331
20190430

表2-项目

itemid date
101    20190131
101    20190229
101    20190331
102    20190131
102    20190331
102    20190430

上表中的日历是包含所有日期的主表,而items表包含不同item id的数据,主表中的某些日期与之对应。例如,itemid 101缺少日期20190430,102缺少日期20190229。
我需要输出,呈现为101 20190430和另一行102 20190229两行。
我尝试了右外连接,但是没有任何效果,因为需要对分组记录进行过滤。请建议。

goqiplq2

goqiplq21#

cross join 日历到不同的项目和 left join items表以获取缺少的行。

select i.itemid,c.month_last_day
from calendar c 
cross join (select distinct itemid from items) i
left join items it on it.itemid = i.itemid and c.month_last_day = it.dt
where it.dt is null
omqzjyyz

omqzjyyz2#

在配置单元中使用交叉联接和左外部联接进行查询。

with calendar as 
(select '20190131' last_day union all
 select '20190229' last_day union all
 select '20190331' last_day union all
 select '20190430' 
) 
,items as 
(select 101 itemid,'20190131' dt union all
 select 101 itemid,'20190229' dt union all
 select 101 itemid,'20190331' dt union all
 select 102 itemid,'20190131' dt union all
 select 102 itemid,'20190331' dt union all
 select 102 itemid,'20190430' dt
),
res1 as 
(select i.itemid, c.last_day from calendar c, (select distinct itemid from items) i)

select res1.itemid, res1.last_day from res1 left outer join items i on res1.itemid = i.itemid and res1.last_day=i.dt where i.dt is null;

相关问题