Excel:根据时间条件删除重复项

时间:2017-05-23 00:51:05

标签: excel duplicates

我希望根据3个月的滚动时间条件从250,000行excel表中删除重复项。

我们有很多用户ID和访问日期,但很多这些访问距离很远(有时超过一年),而且很多都是在同一天/几天内。

解释我想要做的最好方法是举个例子。因此,如果他们首次访问1月1日,1月1日,1月3日,2月8日,6月4日,6月5日,12月1日,12月1日,12月2日,我想抓住1月1日,6月4日和12月1日的第一个日期

如果他们参观1月1日,1月1日,1月3日,2月8日,4月9日,8月1日,9月1日,我会想要1月1日和8月8日。

所以我们想抓住第一次约会,然后看看他们在每次访问的3个月内访问的频率,如果他们离开的时间超过3个月,请抓住他们返回的第一个约会。有时他们会在3个月后回来4到5次,数据可能会持续数年。

我有办法实现这个目标吗?获得一些帮助会很棒,因为这让我很生气。

干杯

1 个答案:

答案 0 :(得分:2)

如果UserID在A列中,并且VisitDate在B中,标题在第1行,然后是2中的空行和从第3行开始的数据,那么试试这个(下面的说明):

数组公式版本:

  • 按VisitDate
  • 升序排序 B2中的
  • 放在1/1/1900,所以它不会匹配任何东西(但必须是约会)
  • 在C3中放入此数组公式(按control-shift-enter而不是只输入):
    • =SUM((B$2:B2<DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)))*(A$2:A2=A3))=SUM((A$2:A2=A3)*1)
  • 将C3中的公式复制到每行数据
  • 过滤于Unique = TRUE
  • 如果您想要求助,则需要按值
  • 复制和粘贴C列

新的非数组公式版本:

  • 按VisitDate
  • 升序排序 B2中的
  • 放在1/1/1900,所以它不会匹配任何东西(但必须是约会)
  • C3中的
  • 把这个正常的公式(只需按回车键):
    • =COUNTIFS(B$2:B2,"<"&DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)),A$2:A2,A3)=COUNTIF(A$2:A2,A3)
  • 将C3中的公式复制到每行数据
  • 过滤于Unique = TRUE
  • 如果您想要求助,则需要按值
  • 复制和粘贴C列

这会产生以下样本数据(数组公式可能需要很长时间来计算很多行):

   |    A   |      B     |   C
---+--------+------------+--------
 1 | UserID |  VisitDate | Unique
 2 |        |  1/01/1900 | 
 3 | a      |  1/01/2017 | TRUE
 4 | a      |  1/01/2017 | FALSE
 5 | b      |  2/01/2017 | TRUE
 6 | b      |  2/01/2017 | FALSE
 7 | a      |  3/01/2017 | FALSE
 8 | c      |  3/01/2017 | TRUE
 9 | c      |  3/01/2017 | FALSE
10 | b      |  4/01/2017 | FALSE
11 | c      |  5/01/2017 | FALSE
12 | a      |  8/02/2017 | FALSE
13 | b      |  9/02/2017 | FALSE
14 | c      | 10/02/2017 | FALSE
15 | a      |  4/06/2017 | TRUE
16 | a      |  5/06/2017 | FALSE
17 | b      |  5/06/2017 | TRUE
18 | b      |  6/06/2017 | FALSE
19 | c      |  6/06/2017 | TRUE
20 | c      |  7/06/2017 | FALSE
21 | a      |  1/12/2017 | TRUE
22 | a      |  1/12/2017 | FALSE
23 | a      |  2/12/2017 | FALSE
24 | b      |  2/12/2017 | TRUE
25 | b      |  2/12/2017 | FALSE
26 | b      |  3/12/2017 | FALSE
27 | c      |  3/12/2017 | TRUE
28 | c      |  3/12/2017 | FALSE
29 | c      |  4/12/2017 | FALSE

由于公式将当前行与上面的所有行进行比较,以查找过去具有日期的行,因此需要先使用最早的日期对数据进行排序。

数组公式的工作原理:

=SUM((B$2:B2<DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)))*(A$2:A2=A3))=SUM((A$2:A2=A3)*1)

  • DATE(YEAR(B3),MONTH(B3)-3,DAY(B3))是3个月前(即使是92天)
  • (B$2:B2<DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)))是一个TRUE / FALSE值数组,对于早于3个月前的每一行都有一个TRUE
  • (A$2:A2=A3)是一个TRUE / FALSE值数组,对于与用户ID匹配的每一行,其值为TRUE
  • (B$2:B2<DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)))*(A$2:A2=A3)执行数组的AND,因此对于具有相同名称且日期早于3个月之前的每一行,返回1(TRUE * TRUE = 1)
  • SUM((B$2:B2<DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)))*(A$2:A2=A3))添加上面所有具有相同名称且日期早于3个月前的TRUE行
  • SUM((A$2:A2=A3)*1)添加上面具有相同名称的行数(TRUE * 1 = 1)
  • =SUM((B$2:B2<DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)))*(A$2:A2=A3))=SUM((A$2:A2=A3)*1)比较两个总和,如果上面所有具有相同名称的行都超过3个月前,则返回TRUE

方法:

我最初只玩了一列日期 - 没有用户ID。我想找到一种方法来了解某个特定日期是否在它之前的所有日期之后超过3个月(我隐含地假设日期已经排序)。我推断,如果当前行之前的日期计数与当前行之前超过3个月的日期计数相匹配,那么我会得到我想要的答案。所以我最初将这个公式放在C3中并将其复制下来:

  • =COUNTIF(B$2:B2,"<"&(B3-90))=COUNTA(B$2:B2)

然后将其更改为3个月而不是90天:

  • =COUNTIF(B$2:B2,"<"&DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)))=COUNTA(B$2:B2)

然后要添加userID,我们需要一种方法来比较多个条件 - 这就是COUNTIFS的用武之地(如果您有Excel 2007或更高版本):

  • =COUNTIFS(B$2:B2,"<"&DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)),A$2:A2,A3)=COUNTIF(A$2:A2,A3)

然后我将它转换为这个数组公式:

  • =SUM((B$2:B2<DATE(YEAR(B3),MONTH(B3)-3,DAY(B3)))*(A$2:A2=A3))=SUM((A$2:A2=A3)*1)

回想起来,我不知道给出数组公式是否是个好主意:我不知道数组公式是否比COUNTIFS更好/更快。所以请根据自己的喜好使用。