如何使用多个条件从表中仅计算唯一值的出现次数?

3
我试图计算每个角色(管理员、mod、普通用户等)在指定时间段内(1个月、3个月、6个月、1年)登陆的用户百分比。由于这个电子表格应该是自动计算的,所以编辑我正在提取的数据表不是一个选项(如果这有意义的话)。现在,我只需要数字,因为计算百分比应该很简单。
我使用的列是 id、eventTime、ScreenName 和 userGroup。
例如,我想要计算最近一个月内有多少名来自“admin”用户组的用户登录。我使用ScreenName因为它是唯一的和eventTime因为它记录了时间。我正在提取的数据记录了用户查看网站上每个页面的时间、用户名、用户组和页面名称,因此同一天用户可能会有多个条目。
我已经编写的代码:
=SUMPRODUCT(((data!$B:$B>(TODAY()-30))*(data!$B:$B<=TODAY()))*(data!$G:$G=G$1))

'data' 是我试图从中进行计数的工作表。

以下是一些伪代码以帮助您理解:

SUMPRODUCT((eventTime>30 days ago)*(evenTime<todays date))*(userGroup = referenced userGroup))

如果我以管理员身份登录并查看网站上的七个页面,则数据将有七个不同的行存储页面/时间/我的用户名/我的角色数据。上面的公式计算了我的用户名出现的每个实例,而不是登录的用户数。例如,我希望它返回“1”,因为只有一个用户在那个月登录,即使他们查看了几个页面。但是该方程式正在返回“7”。
简而言之,我正在尝试列出指定时间范围内活跃用户的数量。我的公式是一个月的。但我只需要计算唯一的screenName /每个屏幕名称一次。
以下是我提取数据的示例:
1个回答

2
如果您有一个所有ScreenNames的列表(仅列出一次,名为 ScreenNamesList ),那么最简单的方法是这样做,假设ScreenNames在A列中: =SUMPRODUCT((COUNTIFS(data!$B:$B,">"&TODAY()-30,data!$B:$B,"<="&TODAY(),data!$G:$G,G$1,data!$A:$A,ScreenNamesList)>0)+0) ...但如果您没有这样的列表,则可以使用此公式-请注意缩小范围,整个列将非常慢: =SUM(IF(FREQUENCY(IF(data!$B$2:$B$1000>TODAY()-30,IF(data!$B$2:$B$1000<=TODAY(),IF(data!$G$2:$G$1000=G$1,MATCH(data!$A$2:$A$1000,data!$A$2:$A$1000,0)))),ROW(data!$A$2:$A$1000)-ROW(data!$A$2)+1),1)) 需要使用CTRL+SHIFT+ENTER确认公式。

谢谢你的回答,Barry!我昨晚本来想添加一张图片的,所以如果有帮助的话,我现在加了一个数据样例。 - Cecil
当你说“列表”时,你是指一个简单的列,其中填充了唯一的屏幕名称吗?我能够编写一些VBA代码来过滤重复项,并将其粘贴到名为“screen_names”的新工作表的A列中。 - Cecil
我可以将数据透视表用作列表吗? - Cecil
我不确定为什么公式只会返回零。我创建了一个VBA按钮,可以在“screen_names”工作表上生成唯一屏幕名称的列,然后我单击了该列(在新工作表上所在的位置)并将该列命名为ScreenNamesList。现在在公式中,我应该只需要将$A:$A更改为$C:$C,我想。您知道我还在犯什么错误吗?谢谢,您帮了我很多忙。 - Cecil
好的 - 抱歉连续发了多篇帖子,但我无法编辑我的上一篇帖子。我最终成功了 :) 谢谢。我最终只是突出显示了唯一屏幕名称的范围。但有没有办法使它变得动态?我将使用此电子表格与其他数据模型一起使用,未来可能会有更多的用户名 - 我希望确保公式读取所有用户名,而不是停在先前使用的数字。谢谢。 - Cecil
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接