2015-05-29 39 views
0

我试图计算出我们的客户群每个月增长的次数。每个月的唯一记录的T-SQL计数

例如, “Josh”,“Tim”和“Dustin”已于1月份使用该服务,因此1月份新独特客户的数量为3.

2月份的“Josh”,“Tim”和“Eve”使用该服务。作为“乔希”和“添”以前使用的服务,新的独特的客户数量将是1

等等....

我想,除了语句中使用,但显然这是没有得到正确的结果。

SELECT COUNT(DISTINCT Name) as NewUniqueCustomers, convert(varchar(7), RegDate, 126) 
FROM T 
GROUP BY convert(varchar(7), RegDate, 126) 
EXCEPT 

--This should excludie all customers which was included previously 
SELECT COUNT(DISTINCT Name)as NewUniqueCustomers, convert(varchar(7), RegDate, 126) 
FROM T 
WHERE convert(varchar(7), DATEADD(month,-1,RegDate) , 126) 

GROUP BY convert(varchar(7), RegDate, 126) 

http://sqlfiddle.com/#!3/73621

+0

只是一个说明。不用将日期转换为字符串,而是使用'cast(RegDate as Date)'。转换会阻止服务器使用索引,并导致性能非常差。 –

+0

我希望他们按年份分组。我只是在努力寻找一种方法来排除上个月包含的名称 – Petrik

+0

某些代码正在执行插入的用户?如果这就是为什么不插入检查用户是否已经存在,并添加一个标志,它已经存在或没有, 计数是更容易,你可以添加条件来计算只有那些你被标记为新的用户 – Sherlock

回答

3

使用您的sqlfiddle这应该这样做。

with SortedData as 
(
    select * 
     , ROW_NUMBER() over(partition by Name order by RegDate) as RowNum 
    from t 
) 

select dateadd(month, datediff(month, 0, RegDate), 0) 
    , COUNT(Name) 
from SortedData sd 
where sd.RowNum = 1 
group by dateadd(month, datediff(month, 0, RegDate), 0) 

- 编辑 -

鉴于你对需要从两个表中拉了工会为什么不喜欢此评论吗?

with SortedData as 
(
    select * 
     , ROW_NUMBER() over(partition by Name order by RegDate) as RowNum 
    from 
    (
     SELECT * FROM ProductionTable 
     UNION ALL 
     SELECT * FROM Archive.dbo.T 
    ) 
    x 
) 
+0

这很好,但是在实时系统中,我需要UNION ALL两个表(Live和归档数据库)。我通常做子查询像FROM(选择*从T UNION所有选择*从Archive.dbo.T),但我得到这个子查询错误。有任何想法吗? – Petrik

+0

谢谢。我完全忘记了我需要在子查询之后使用别名表。 – Petrik