2016-11-01 1 views
0

Ich erstelle eine Datenbank für die Videowiedergabeseite und ich habe eine Tabelle mit Benutzern und einer Tabelle mit Anzeigeverlauf. Ich muss mithilfe der SQL-Abfrage mehrere der am häufigsten beobachteten Paare von Videos finden. Beispiel: Benutzer 1 sah Videos 12, 43, 50, 66, 78; Benutzer 2 sah 12, 43, 45, 50; Benutzer 3 beobachtete 12, 35, 50, 66, 78; user 4 sah zu 33, 66, 69, 78 So sind die beiden meistgesehenen Paare (12,50) und (66,78). Aber ich kann nicht einmal, wie man diese Paare für die zukünftige Zählung bildet. Also, meine Frage ist, wie man alle möglichen Paare bildet und die Quantität der Ansichten von jedem von ihnen zählt.Bilden und zählen Sie das am häufigsten besuchte Paar. Sql oracle

+1

'Gruppe nach Benutzer, Film' – jarlh

+0

@jarlh - sorgfältig zu erarbeiten? Ich sehe nicht, wie die Gruppierung nach Benutzer, Film hat etwas mit der Frage zu tun. – mathguy

Antwort

0

Selbst join ist der richtige Weg, dies zu tun. Ich denke, die einfachste Form der Abfrage lautet:

select vh.* 
from (select vh1.movie as movie1, vh2.movie as movie2, count(*) as cnt, 
      rank() over (order by count(*) desc) as seqnum 
     from viewing_history vh1 inner join 
      viewing_history vh2 
      on vh1.userid = vh2.userid and vh1.movie < vh2.movie 
     group by vh1.movie, vh2.movie 
    ) vh 
where seqnum = 1; 
0

In der folgenden Lösung erstellen Sie eine Unterabfrage, um Eingabedaten zu simulieren. In Ihrer Anwendung sollten Sie anstelle von viewing_history Ihre Anzeigeverlaufstabelle verwenden. Ich sehe nicht, wie die Tabelle "users" in diesem Problem relevant ist. Die zweite Unterabfrage, die ich movie_pairs nannte, ist ein innerer Join des Betrachtungsverlaufs mit sich selbst - so erstellen Sie die Paare. Ich ging darüber hinaus - mit dem in der Hand, fuhr ich fort, die Paare zu identifizieren, die am häufigsten zusammen betrachtet werden.

with 
    viewing_history (userid, movie) as (
     select 1, 12 from dual union all 
     select 1, 43 from dual union all 
     select 1, 50 from dual union all 
     select 1, 66 from dual union all 
     select 1, 78 from dual union all 
     select 2, 12 from dual union all 
     select 2, 43 from dual union all 
     select 2, 45 from dual union all 
     select 2, 50 from dual union all 
     select 3, 12 from dual union all 
     select 3, 35 from dual union all 
     select 3, 50 from dual union all 
     select 3, 66 from dual union all 
     select 3, 78 from dual union all 
     select 4, 33 from dual union all 
     select 4, 66 from dual union all 
     select 4, 69 from dual union all 
     select 4, 78 from dual 
    ), 
-- end test data, query begins here (but include the keyword WITH from above) 
    movie_pairs (movie1, movie2, ct) as (
     select  a.movie, b.movie, count(*) 
     from  viewing_history a inner join viewing_history b 
         on a.userid = b.userid and a.movie < b.movie 
     group by a.movie, b.movie 
    ) 
select movie1, movie2 
from movie_pairs 
where ct = (select max(ct) from movie_pairs) 
order by movie1, movie2 -- ORDER BY is optional 
; 

Ausgang:

MOVIE1  MOVIE2 
---------- ---------- 
     12   50 
     66   78  
Verwandte Themen