2016-03-30 18 views
1

sayıları sayımları için A, B ve C tabloları olan bir rapor oluşturmam gerekir. Hive ve benim S3 kova kullanarak saklanan eg için Organization_idBirden çok tablodan Kayıt Sayısı Toplamını bulmak için kovan sorgularımı nasıl en iyi duruma getirebilirim

tarafından bölümlenmiş edilmiştir: Tablo A - John (ve diğer çalışanlar) Tablo B işe gider her gün için bir kayıt Has - her çağrı için bir rekor Has John (ve diğer çalışanlar) işyerinde iş yapar veya alır Tablo C - John'un (ve diğer çalışanların) işyerinde gönderdiği her masraf için bir kayıt vardır

Temel olarak, son bir ay içinde John (employee_id) için A, B ve C sayımlarının toplamını istiyorum. A, B veya C tablolarından birinde bir kayıt varsa her tarih için sadece bir kayıt olmalıdır (ve tablolardan birinde veya daha fazlasında bir tarih için bir kayıt varsa sayıları toplayın). Yani benim Çıktı: Ben ile geldi

Employee id 
Employee Name 
Date 
Count 
123 
John 
02-Jan-2016 
55 
123 
John 
12-Jan-2016 
88 
123 
John 
19-Jan-2016 
103 

sorgusu:

select adcts.employee_name, adcts.employee_id,Total_count as event_count, adcts.event_date 
from 
     (select coalesce(Evts.employee_id,imps.employee_id,AEvts.employee_id) as employee_id 
     , coalesce(Evts.employee_name,imps.employee_name,AEvts.employee_name) as employee_name 
     , coalesce(Evts.Event_count,0) + coalesce(Imps.Impression_count,0) + coalesce (AEvts.Event_Count,0)as Total_Count 
     , coalesce (Evts.event_date,imps.impression_date, AEvts.event_date) as event_date 
    from 
     (select employee_id, employee_name, count(*) as Event_count,event_date 
     from mm_events 
     where organization_id = 100048 
     and event_date between '2016-02-01' and '2016-02-04' 
     group by employee_id, employee_name,event_date) Evts 
     full outer join 
     (select employee_id, employee_name, count(*) as Impression_count, impression_date 
     from mm_impressions 
     where organization_id = 100048 
     and impression_date between '2016-02-01' and '2016-02-04' 
     group by employee_id, employee_name,impression_date) Imps 
     on Evts.employee_id = Imps.employee_id 
     full outer join 
     (select employee_id, employee_name, count(*) as Event_count,event_date 
     from mm_attributed_events 
     where organization_id = 100048 
     and event_date between '2016-02-01' and '2016-02-04' 
     and event_type = 'click' 
     group by employee_id, employee_name,event_date) AEvts 
    on AEvts.employee_id=Evts.employee_id 
     ) adcts  
join 
     (select distinct c.employee_id from default.t1_meta_dmp c 
     where c.employee_dmp_enabled='inherits' 
     and c.agency_dmp_enabled = 'inherits' 
     and c.agency_status='true' 
     and c.employee_status='true' 
     and c.organization_id = 100048) cc 
on adcts.employee_id=cc.employee_id 
order by adcts.employee_id asc 

ben 2 soru var:

1. Ben doğru sorgu var? 2. “Tam dış birleştirme” kullanıyorum çünkü aynı tarih için birden fazla girdi alıyorum. Birisi sonuca ulaşmak için daha iyi bir yol önerebilir mi? Farklı sorgu belki

cevap

0

Eğer alt sorgular içinde date göre gruplama ama employee_id sadece bunları birleştiren olduğunuz için aynı date için birden fazla giriş alıyorsanız. Bu nedenle, kayıtlarınız birleştirildikten sonra çoğaltılır. Birleştirme koşuluna da event_date eklemelisiniz.

FULL JOIN'a hiç ihtiyacınız yok gibi görünüyor. Katılmak, union all'dan daha pahalıdır. Kullanım BİRLİĞİ TÜM her tablonun ardından group by employee_name, employee_id, event_date ve toplam sayım() seçin:

select employee_id, employee_name, sum(Event_count) as Total_Count , event_date 
    from 
    (
    select employee_id, employee_name, count(*) as Event_count, event_date from mm_events 
    where organization_id = 100048 and event_date between '2016-02-01' and '2016-02-04' 
group by employee_id, employee_name, event_date 

    union all 
    select employee_id, employee_name, count(*) as Event_count, impression_date as event_date 
    from mm_impressions 
    where organization_id = 100048 and impression_date between '2016-02-01' and '2016-02-04' 
group by employee_id, employee_name,impression_date 

    union all 
    select employee_id, employee_name, count(*) as Event_count,event_date 
    from mm_attributed_events 
    where organization_id = 100048 and event_date between '2016-02-01' and '2016-02-04' and event_type = 'click' 
group by employee_id, employee_name, event_date 
    ) adcts 
    group by employee_id, employee_name, event_date 

yukarıdaki sorguya cc sorgu ile katılmak sizin ekleyin.

UNION ALL alanındaki tüm alt sorgular paralel olarak çalışacaktır

İlgili konular