已执行操作的每月分组用户

时间:2016-11-14 07:54:01

标签: sql sql-server

我有两张桌子..

1)用户 使用列:

              userid      createddate
               1          01/01/2016
               2          02/01/2016
               3          03/01/2016

2)剧 使用列:

             userid       playdate
              1          07/03/2016
              2          06/04/2016

上面显示的日期是MM / dd / yyyy格式 从表Plays我得到了一个表格丰富的表格,每个用户标识只有一个顶行

users表有大约5 mil的行,而richhedplays有大约3mil的行。 有很多用户虽然在用户中不在播放中。

我需要将每月用户(在MONTH(createddate)上)与播放中存在的用户ID进行分组。

我的意思是在1月份用户表中有10个用户。 在这10个用户中,只有5个用户出现在播放表中,并且它们出现在哪个月无关紧要。

所以,在我得到的数据中,我需要5对1月。

因此,对于上面的样本数据,结果将是

Jan-2016   1
Feb-2016   1
March-2016 0

虽然,我使用的是SQL SERVER,但它可能会发生变化,所以会很感激标准sql的答案。

2 个答案:

答案 0 :(得分:0)

尝试以下查询,

SELECT createddate, SUM(CASE WHEN ep.userid IS NOT NULL THEN 1 ELSE 0 END) sum_value
FROM users u
 LEFT JOIN enrichedplays ep
  ON u.userid = ep.userid
GROUP BY createddate;

注意:请将createddate转换为您需要的格式。

答案 1 :(得分:0)

您需要根据createddate的月份和年份对用户进行分组。 检查以下查询,希望它可以帮助您:

declare @users table(userid int, createddate datetime)
declare @plays table(userid int, playdate datetime)

Insert into @users
select 1, '01/01/2016'
union 
select 2, '01/01/2016'
union 
select 1, '02/01/2016'
union 
select 2, '03/01/2016'
union 
select 3, '03/01/2016'



Insert into @plays
select 1, '01/01/2016'
union 
select 2, '01/01/2016'


select format(u.createddate,'MMM-yyyy'), SUM(CASE WHEN p.userid IS NOT NULL THEN 1 ELSE 0 END) sum_value
from @users u
left join @plays p on p.userid = u.userid
Group By format(u.createddate,'MMM-yyyy')