随着时间的推移重复条目计数不同
Posted
技术标签:
【中文标题】随着时间的推移重复条目计数不同【英文标题】:Count distinct with repeating entries over time 【发布时间】:2016-05-12 15:03:13 【问题描述】:这是我的第一个 *** 问题,所以请保持温和 ;-)
我有一个包含唯一客户 ID 的表和一个包含特定交易类型(购买、预售等)的交易的表
我要统计的是所有做过一次特定交易类型的客户。但如果客户在 2014 年进行了符合条件的交易,我不希望该客户在 2015 年再次被计算在内。这有意义吗?
我尝试了以下说法:
SELECT
datepart(yyyy,t.TransactionDate)
,count(DISTINCT c.customerID)
FROM Customers as c
JOIN Transactions as t
ON c.CustomerID = t.CustomerID
WHERE t.TransactionType = 'presell'
GROUP BY datepart(yyyy,t.TransactionDate)
问题在于,当然,客户可以每年进行一次相同的交易类型。因此,在此声明中,我计算了每年不同的客户......而不是总共一次。
编辑:让我们让它更容易一些。只有一张桌子,这张桌子看起来有点像这样:
所以如果我过滤“预售”,我的结果应该看起来像这样
2014 年客户 A 进行了预售,2015 年客户 B 进行了预售,2016 年客户 A 再次进行了预售,但我没有计算这个客户,因为我在 2014 年已经计算过了。希望能让事情更清楚一点.
在这里感谢您的任何建议和帮助。
【问题讨论】:
当您说:“但是如果客户在 2014 年进行了符合条件的交易”,您的意思是您只想计算相隔 2 年的符合条件的交易吗?请详细说明 欢迎来到 ***。在询问 SQL 问题时,如果您包含表结构、示例数据和预期输出,以及您所做的任何尝试以及它们如何不起作用(返回错误数据,给出错误等)。请看:***.com/help/how-to-ask 正如 Tom H 所说,如果您冷包括 2 个表的示例,以及您期望从查询中获得的结果类型的示例,这将有很大帮助 :) 好的,谢谢您的建议。我编辑了我原来的问题。也许这有帮助 【参考方案1】:当您查看它时,它是您感兴趣的每位客户的第一次预售。您可以通过选择每位客户的MIN(TransactionDate)
轻松获得。完成此操作后,您就可以数数了。
select year, count(*)
from
(
select customerid, min(transactiondate) as year
from transactions
where transactiontype = 'Presell'
group by customerid
) first_presells
group by year
order by year;
【讨论】:
【参考方案2】:由于您想按TransactionType
计算Customers
,因此您应该按CustomerID
和TransactionType
分组,而不是TransactionDate
:
SELECT datepart(yyyy,t.TransactionDate) -- this part won't work anymore without grouping it. Doesn't seem to be relevant to what you're selecting
,count(DISTINCT c.customerID)
FROM Customers as c
JOIN Transactions as t
ON c.CustomerID = t.CustomerID
WHERE t.TransactionType = 'presell'
GROUP BY c.CustomerID, t.TransactionType
这应该返回至少完成一次交易的人数,无论年份。
【讨论】:
【参考方案3】:用途:
SELECT datepart(yyyy,t.TransactionDate) ,
count(*) over (partition by c.CustomerID, t.TransactionType)
FROM Customers as c
JOIN Transactions as t
ON c.CustomerID = t.CustomerID
WHERE t.TransactionType = 'presell'
您可以查看http://www.sqlteam.com/article/sql-sever-2005-using-over-with-aggregate-functions,了解有关此类聚合函数的更多信息。
【讨论】:
以上是关于随着时间的推移重复条目计数不同的主要内容,如果未能解决你的问题,请参考以下文章