计算不同的记录,但每XX天只计算一次

时间:2016-12-15 17:23:48

标签: sql sql-server sql-server-2012

编辑:截至1月1日XXXX的开始日期

我需要根据7天的分组创建不同用户ID的计数。基本上,如果用户在该月的第1天和第2天进行呼叫,则将其计为1次。但是,如果他们在第1天和第10天打电话,那么他们会被计算2次。

表格布局:

userId         CallId        datetime
0              123            01/01/2016 xx:xx:xx
0              124            01/10/2016 xx:xx:xx
1              125            01/10/2016 xx:xx:xx
1              126            01/10/2016 xx:xx:xx
2              127            01/10/2016 xx:xx:xx
1              128            01/30/2016 xx:xx:xx
2              129            01/31/2016 xx:xx:xx

我需要返回的样子:

Count(UserID)  Week#
      1          1
      3          2
      2          4

感谢您的时间。

5 个答案:

答案 0 :(得分:1)

根据Gurwinders的反应,我已经制作了以下内容并包含了几年,以便在几年内仍然可以使用。

SELECT COUNT(UserID), CallYear, CallWeek
FROM (
SELECT DISTINCT UserID, 
                datepart(year,datetime) as CallYear,
                datepart(week,datetime) as CallWeek
FROM my_table
      )
Group By CallYear,CallWeek

答案 1 :(得分:1)

这将产生1月1日开始的滚动不同计数

Declare @YourTable table (userId  int,CallId int,datetime datetime)
Insert Into @YourTable values
(0,123,'2016-01-01'),
(0,124,'2016-01-10'),
(1,125,'2016-01-10'),
(1,126,'2016-01-10'),
(2,127,'2016-01-10'),
(1,128,'2016-01-30'),
(2,129,'2016-01-31')

Select D1
      ,D1 =DateAdd(DD,6,D1)
      ,Cnt=count(Distinct UserID)
 From  @YourTable A
 Join (Select Top 500 D1=DateAdd(DD,(Row_Number() Over (Order By Number)-1)*7,'2016-01-01') From master..spt_values ) B
   on  datetime between D1 and DateAdd(DD,6,D1)
 Group By D1

返回

D1         D1           Cnt
2016-01-01 2016-01-07   1
2016-01-08 2016-01-14   3
2016-01-29 2016-02-04   2

答案 2 :(得分:0)

你可以用这个:

select count(distinct userid), datepart(week, datetime) week, datepart(year, datetime) year
from my_table
group by datepart(week, datetime), datepart(year, datetime);

答案 3 :(得分:0)

你的开始日期是什么时候?你看过DateDiff()函数吗?

答案 4 :(得分:0)

试试这个:

With ABC As (select datepart(week, datetime) as week# from table) Select count(week#) as Times,week# From ABC