我有一个存储用户播放列表的表,多个用户可以多次查看视频。 记录如下:
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只选择不同的用户观看列表,我也想过滤已经观看过两个以上不同视频的用户。
我知道我必须先google并阅读文档,有些人说'HAVING'可以解决这个问题,不幸的是,我无法做到。
答案 0 :(得分: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 <ANY CONDITION>
) t
where cnt > 2;
答案 1 :(得分:2)
试试这个,
SELECT userid, count(*)
FROM table_play_list
WHERE SOME CONDICTION
GROUP BY user_id
having count(*) >2;
如果您需要根据用户ID和视频ID(观看同一视频两次以上的用户)获取计数,请尝试此操作。
SELECT userid, videoid, count(*)
FROM table_play_list
WHERE SOME CONDICTION
GROUP BY user_id, video_id
having count(*) >2;
答案 2 :(得分: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
答案 3 :(得分:0)
以下内容将为观看了两个以上不同视频的用户提供服务。
SELECT userid, count(distinct video_id)
FROM table_play_list
WHERE SOME CONDICTION
GROUP BY user_id
having count(distinct video_id) >2;
答案 4 :(得分:0)
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
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