2013-09-11 1 views
1

У меня есть таблица, в которой хранится список воспроизведения пользователей, видео можно просматривать несколькими пользователями несколько раз. А запись выглядит следующим образом:Группа по двум полям и имеет count() в первом поле

videoid, userid, time 
123,  abc , 2013-09-11 

Это означает, что пользователь (ABC) наблюдали видео (123) на 2013-09-11

Теперь я хочу, чтобы найти различные пользователи смотрели список видео (без дублирования) , и только показать пользователям, просмотревшим больше двух видео.

SELECT videoid, userid 
FROM table_play_list 
WHERE SOME CONDICTION 
GROUP BY userid, videoid 

СКП только выбрать отдельных пользователей список наблюдения, я также хочу, чтобы отфильтровать пользователей, которые просмотрели более двух различных видео.

Я знаю, что мне нужно пойти в Google и сначала прочитать документацию, некоторые сказали, что «HAVING» может решить это, к сожалению, я не мог этого сделать.

ответ

3

Если я правильно понимаю, вы ищете пользователей, просмотревших более двух различных видео. Вы можете сделать это с помощью count(distinct) с пунктом partition by:

select userid, videoid 
from (SELECT userid, videoid, count(distinct videoid) over (partition by userid) as cnt 
     FROM table_play_list 
     WHERE SOME CONDICTION 
    ) t 
where cnt > 2; 
+0

Ты только что спас мне жизнь. –

1

Попробуйте, как это,

SELECT userid, count(*) 
FROM table_play_list 
WHERE SOME CONDICTION 
GROUP BY user_id 
having count(*) >2; 

Попробуйте это, если вам нужно получить счетчик, основанный на ID_пользователя и (пользователи идентификации видео, которые смотрят то же видео более чем в два раза).

SELECT userid, videoid, count(*) 
FROM table_play_list 
WHERE SOME CONDICTION 
GROUP BY user_id, video_id 
having count(*) >2; 
+0

кажется, имея отсчет (*) фильтр как идентификатор пользователя и VideoID. Поэтому я получил пользователей, которые смотрели более двух видеороликов, а также смотрели видео более двух раз. –

+0

Если вам нужно получить счет на основе идентификатора пользователя и видеоигры, найдите измененный ответ. – Dba

+0

Двойной флажок, второй SQL будет выбирать идентификатор пользователя и видео, которое дважды просматривалось одним и тем же пользователем. Я хочу, чтобы пользователи, которые смотрели более двух видеороликов, и видеозапись, которую он смотрел. –

1

Это, вероятно, лучше всего обрабатывается аналитикой. Без аналитики вам, вероятно, потребуется самостоятельное объединение.

SQL> WITH table_play_list AS (
    2  SELECT 123 videoid, 'a' userid FROM dual UNION ALL 
    3  SELECT 125 videoid, 'a' userid FROM dual UNION ALL 
    4  SELECT 123 videoid, 'b' userid FROM dual UNION ALL 
    5  SELECT 123 videoid, 'b' userid FROM dual UNION ALL 
    6  SELECT 123 videoid, 'c' userid FROM dual 
    7 ) 
    8 SELECT videoid, userid, 
    9   COUNT(*) over(PARTITION BY userid) nb_video 
10 FROM table_play_list; 

    VIDEOID USERID NB_VIDEO 
---------- ------ ---------- 
     123 a    2 
     125 a    2 
     123 b    2 
     123 b    2 
     123 c    1 

В нем перечислены все пользователь/видео и общее количество видео, просмотренных каждым пользователем. Как вы можете видеть, пользователь b дважды просматривал одно и то же видео, я не знаю, возможно ли это в вашей системе.

можно фильтровать с помощью подзапроса:

SQL> WITH table_play_list AS (
    2  SELECT 123 videoid, 'a' userid FROM dual UNION ALL 
    3  SELECT 125 videoid, 'a' userid FROM dual UNION ALL 
    4  SELECT 123 videoid, 'b' userid FROM dual UNION ALL 
    5  SELECT 123 videoid, 'b' userid FROM dual UNION ALL 
    6  SELECT 123 videoid, 'c' userid FROM dual 
    7 ) 
    8 SELECT * 
    9 FROM (SELECT videoid, userid, 
10     COUNT(*) over(PARTITION BY userid) nb_video 
11   FROM table_play_list) 
12 WHERE nb_video > 1; 

    VIDEOID USERID NB_VIDEO 
---------- ------ ---------- 
     123 a    2 
     125 a    2 
     123 b    2 
     123 b    2 
+1

Пользователь может смотреть видео дважды. Лучше не использовать самообучение, потому что эта таблица имеет почти 1 миллион записей, я уверен. –

0

Ниже будет давать пользователям, которые просмотрели более двух различных видео.

SELECT userid, count(distinct video_id) 
FROM table_play_list 
WHERE SOME CONDICTION 
GROUP BY user_id 
having count(distinct video_id) >2; 
0
  • Если вы используете Oracle PL/SQL можно использовать следующим образом:
SELECT column1, column2 
FROM 
    (
    SELECT column1, column2, COUNT(column1) 
    OVER (PARTITION BY column1) AS cnt 
    FROM test 
    GROUP BY column1, column2 
    ORDER BY column1 
    ) 
WHERE cnt > 2 
  • Если вы можете использовать стандартный SQL, который вы можете использовать следующим образом:
SELECT column1, column2 
FROM test 
WHERE column1 IN 
    (
     SELECT column1 
     FROM 
     (
      SELECT column1, column2 
      FROM test 
      GROUP BY column1, column2 
      ORDER BY column1 
     ) 
     GROUP BY column1 
     HAVING COUNT(column1) > 2 
    ) 
GROUP BY column1, column2 
ORDER BY column1 
Смежные вопросы