5

我有一个存储用户播放列表的表格,一个视频可以被多个用户多次观看。一个记录是这样的:

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

这意味着用户(abc)在 2013-09-11 观看了视频(123)

现在我想找到不同的用户观看视频列表(不重复),并且只显示观看过两个以上视频的用户

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

sql 只选择不同的用户监视列表,我还想过滤观看过两个以上不同视频的用户。

我知道我必须先用谷歌搜索并阅读文档,有人说“有”可以解决这个问题,不幸的是,我做不到。

4

5 回答 5

6

如果我理解正确,您正在寻找观看过两个以上不同视频的用户。您可以通过使用count(distinct)withpartition by子句来做到这一点:

select userid, videoid
from (SELECT userid, videoid, count(distinct videoid) over (partition by userid) as cnt
      FROM table_play_list
      WHERE <ANY CONDITION>
     ) t
where cnt > 2;
于 2013-09-11T11:36:23.280 回答
3

像这样试试

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

如果您需要根据 userid 和 videoid(观看同一视频两次以上的用户)获取计数,请尝试此操作。

SELECT userid, videoid, count(*)
FROM   table_play_list
--WHERE SOME CONDITION
GROUP BY user_id, video_id
having count(*) >2;
于 2013-09-11T07:58:51.027 回答
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
于 2013-09-11T08:58:16.040 回答
0

下面将为观看过两个以上不同视频的用户提供。

 SELECT userid, count(distinct video_id)
 FROM   table_play_list
 WHERE SOME CONDICTION
 GROUP BY user_id
 having count(distinct video_id) >2;
于 2013-09-11T09:34:58.930 回答
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
于 2014-12-01T13:18:11.770 回答