刚刚开始使用Excel,我正在使用数据库提取,只有当另一列中的项目是唯一的时才需要计算值。
所以 - 以下是我的出发点:
= SUMPRODUCT(COUNTIF(C3:C94735,{“可共享的内容对象参考模型1.2”,“创作的SCORM / AICC内容”,“创作的外部Web内容”}))
我想弄清楚的是做这样的事情的语法 -
= sumproduct(Countif range1 criteria ...,其中range2 criteria =“是唯一值”)
我说得对吗?语法有点令人困惑,我不确定我是否为该任务选择了正确的函数。
答案 0 :(得分:1)
假设源数据按键值[A]排序,从确定键列的出现开始
B2: =IF(A2=A1;B1+1;1)
接下来确定组和
C2: =SUMIF($A$2:$A$9;A2;$B$2:$B$9)
如果密钥组的总和恰好为1
,则密钥是唯一的D2: =(C2=1)
要计算与某个标准匹配并且唯一的记录,请在=IF(AND(D2, [yourcondition];1;0)
中添加D列并对此列求和
另一种选择是,如果一个密钥在排序列表中是唯一的,如果它与它的前任和后继版本都不相等,那么你可以找到像
这样的唯一记录。E2: =AND(A2<>A1;A2<>A3)
G2: =IF(AND(E2;F2="this");1;0)
E和G当然可以组合成一个单独的公式(不确定,如果这有帮助......)
G2(2): =IF(AND(AND(A2<>A1;A2<>A3);F2="this");1;0)
解决不必要的嵌套AND:
G2(3): =IF(AND(A2<>A1;A2<>A3;F2="this");1;0)
第2行中的所有公式都应该向下复制到列表的末尾
答案 1 :(得分:1)
我不得不在一周前解决同样的问题。
即使您无法始终对分组列(在您的情况下为J)进行排序,此方法仍然有效。如果您可以对数据进行排序,那么@MikeD的解决方案将会更好地扩展。
首先,你知道计算唯一数字的FREQUENCY技巧吗? FREQUENCY旨在创建直方图。它需要两个数组,'数据'和'箱'。它对'bins'进行排序,然后创建一个比'bins'长一个的输出数组。然后它获取'data'中的每个值并确定它属于哪个bin,相应地递增输出数组。它返回数组。这是重要的部分:如果一个值不止一次出现在'bins'中,那么意味着该bin的任何'data'值都会出现在第一次出现。诀窍是对“数据”和“容器”使用相同的数组。仔细考虑一下,您会看到输入中每个唯一数字的输出中有一个非零值。请注意,它只计算数字。
简而言之,我用这个:
=SUM(SIGN(FREQUENCY(<array>,<array>)))
计算<array>
由此,我们只需要在适当的地方构建包含数字的数组,并在其他地方构建文本。
在下面的例子中,我正在计算颜色为红色且水果是柑橘的独特日子:
这是我的条件数组,对我感兴趣的行返回1或true:
($A$2:$A$10="red")*ISNUMBER(MATCH($B$2:$B$10,{"orange","grapefruit","lemon","lime"},0))
请注意,这需要将ctrl-shift-enter
用作数组公式。
由于我为唯一性分组的值是文本(与你的一样),我需要将其转换为数字。我用:
MATCH($C$2:$C$10,$C$2:$C$10,0)
请注意,这也需要ctrl-shift-enter
所以,这是我正在寻找唯一性的数值数组:
IF(($A$2:$A$10="red")*ISNUMBER(MATCH($B$2:$B$10,{"orange","grapefruit","lemon","lime"},0)),MATCH($C$2:$C$10,$C$2:$C$10,0),"")
现在我把它插入我的唯一性计数器:
=SUM(SIGN(FREQUENCY(<array>,<array>)))
得到:
=SUM(SIGN(FREQUENCY(
IF(($A$2:$A$10="red")*ISNUMBER(MATCH($B$2:$B$10,{"orange","grapefruit","lemon","lime"},0)),MATCH($C$2:$C$10,$C$2:$C$10,0),""),
IF(($A$2:$A$10="red")*ISNUMBER(MATCH($B$2:$B$10,{"orange","grapefruit","lemon","lime"},0)),MATCH($C$2:$C$10,$C$2:$C$10,0),"")
)))
同样,必须使用ctrl-shift-enter
将其作为数组公式输入。用SUMPRODUCT替换SUM不会削减它。
在您的示例中,您将使用以下内容:
=SUM(SIGN(FREQUENCY(
IF(ISNUMBER(MATCH($C$3:$C$94735,{"Sharable Content Object Reference Model 1.2","Authored SCORM/AICC content","Authored External Web Content"},0)),MATCH($J$3:$J$94735,$J$3:$J$94735,0),""),
IF(ISNUMBER(MATCH($C$3:$C$94735,{"Sharable Content Object Reference Model 1.2","Authored SCORM/AICC content","Authored External Web Content"},0)),MATCH($J$3:$J$94735,$J$3:$J$94735,0),"")
)))
但是,我会注意到,缩放可能是与您的数据集一样大的问题。我在更大的数据集上进行了测试,它在10k行的数量级上相当快,但是在100k行的顺序上非常慢,例如你的行。内部数组速度很快,但FREQUENCY函数速度变慢。我不确定,但我猜它在O(n log n)和O(n ^ 2)之间,具体取决于排序的实现方式。
也许这没关系 - 这些都不是易变的,所以它只需要在刷新数据时计算一次。但是,如果列数据发生变化,这可能会很痛苦。