按两个字段分组,并在第一个字段上有count()

问题描述 投票:2回答: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只选择不同的用户观看列表,我也想过滤已经观看过两个以上不同视频的用户。

我知道我必须先google并阅读文档,有些人说'HAVING'可以解决这个问题,不幸的是,我无法做到。

oracle group-by having
5个回答
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;

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;

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

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
© www.soinside.com 2019 - 2024. All rights reserved.