随着时间的推移重复条目计数不同

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,因此您应该按CustomerIDTransactionType 分组,而不是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,了解有关此类聚合函数的更多信息。

【讨论】:

以上是关于随着时间的推移重复条目计数不同的主要内容,如果未能解决你的问题,请参考以下文章

分组,计数并过滤掉与大于1的计数对应的条目[重复]

MySQL查询仅返回具有计数的重复条目

删除重复的数组条目

在postgresql中将重复的连续事件计数为组

检查数组中的重复条目,但仅返回重复的值 [重复]

计算重复列并更新计数器列