首页 > 解决方案 > 本月每周至少观看一部电影的所有用户列表

问题描述

create table active_users(
user_id numeric,
movie_streamed date
)


insert into active_users values (1,'2020-01-2'::date);

insert into active_users values (1,'2020-01-9'::date);

insert into active_users values (1,'2020-01-16'::date);

insert into active_users values (1,'2020-01-23'::date);

insert into active_users values (1,'2020-01-30'::date);

insert into active_users values (2,'2020-01-14'::date);

insert into active_users values (2,'2020-01-16'::date);

大家好,

我正在寻找一个查询,该查询将帮助我获得本月每周至少观看一部电影的用户(作为测试数据)。给定每条记录都有 user_id 的数据,以及该特定人在给定日期观看电影的时间。我想要一个通用的答案。不像每个月有4周。因为在某些情况下也可能有 5 周。

标签: sqlpostgresql

解决方案


您可以generate_series(1,5)从 1 数到 5 来使用,因为应该有 5 个不同的周可能存在,甚至您已经提到的未完成。

诀窍是比较当月每周的开始日期的不同计数:

SELECT u.user_id  
  FROM active_users u 
  JOIN generate_series( 1, 5 ) g  
    ON date_trunc('week', movie_streamed) 
     = date_trunc('week', current_date) + interval '7' day * (g-1) 
 GROUP BY u.user_id
HAVING COUNT(DISTINCT date_trunc('week', movie_streamed))  = 
            (
             SELECT COUNT(*)
               FROM generate_series( 1, 5 ) g
              WHERE to_char(current_date,'yyyymm') 
                  = to_char(date_trunc('week', current_date) 
                    + interval '7' day * (g-1),'yyyymm')                  
            );

Demo


推荐阅读