2016-07-06 5 views
0

Arbeiten an einer ziemlich komplexen SQL-Anweisung, und nicht die meisten aufgetretene Anzahl von Prop_Listen während der Aggregation über Benutzer. Hier ist ein Beispiel meiner Daten-Set:SQL-Partition nach Zeit bei der Aggregation

user_id, term_id, time_stamp, prop_list 
u100, t10, 7:00, (a,b,c) 
u100, t10, 7:01, (a,b) 
u100, t11, 7:01, (a,b) 
u101, t10, 7:00, (a,b,c) 
u101, t10, 7:01, (a) 
u102, t10, 6:59, (a) 

gewünschte Ausgabe:

term_id, term_id_distinct_count, prop_list 
t10, 3, (a,b,c) 
t11, 1, (a,b) 

Hier ist meine aktuellen Code:

select 
    a.term_id, 
    count(distinct user_id) as term_id_distinct_count, 
    a.prop_list 
from 
    (select 
     user_id, term_id, 
     prop_list, 
     row_number() over(partition by user_id, term_id order by time_stamp asc) as row_no 
    from 
     data_table 
    group) a 
where 
    a.row_no = 1; 

Beachten Sie, dass, wenn ein user_id mehrere term_id hatten wir nur wollen um den zu verwenden, der zuerst aufgetreten ist, deshalb sortiere ich nach Zeitstempel asc.

+1

Sie term_id_distinct_count = 3 für Benutzer t10 ... aber aus Ihren Daten scheint es, gibt es nur 2 von sie ... ist es ein Tippfehler oder ich verstehe Ihre Frage nicht – objectNotFound

+2

Bitte markieren Sie Ihre Frage mit der Datenbank, die Sie verwenden. –

Antwort

0

Die meisten Datenbanken, die Fensterfunktionen unterstützen unterstützen count(distinct) als Fensterfunktion, so dass Sie tun können:

select a.term_id, term_id_distinct_count, a.prop_list 
from (select user_id, term_id, prop_list, 
      row_number() over (partition by term_id order by time_stamp asc) as seqnum, 
      count(distinct user_id) over (partition by term_id) as term_id_distinct_count 
     from data_table 
    ) a 
where seqnum = 1; 
Verwandte Themen