对于列值相等的每个组获取大和小,并返回第三列值

我有大量的数据(大约500,000行)与水位信息。 有3列。

A: the water level (ie 0.7) B: the date (ie 03/01/16) C: the time (ie 6:06:00) 

我需要每天从A得到2个最大值和2个最小值,并返回A和C.

所以基本上所有的date是相等的行find最大和最小的告诉我这些价值,并给我相关的时间。

这里有一些数据:

2.730 | 03/04/16 | 3时54分零零秒
2.734 | 03/04/16 | 三点36分00秒
2.735 | 03/04/16 | 三时48分00秒
2.736 | 03/04/16 | 3时42分零零秒
0.046 | 03/05/16 | 10:30:00
0.047 | 03/05/16 | 10:36:00
0.048 | 03/05/16 | 10:24:00
0.050 | 03/05/16 | 10:42:00
0.052 | 03/05/16 | 10时18分零零秒
0.056 | 03/05/16 | 10:48:00

5年内每天约有240行。 最后,我想要一张桌子,每天的时间都是高低不平的。

我曾尝试过各种解决scheme

= LARGE(A2:A241,1)

在列A和

= VLOOKUP(F2,A2:C241,2,FALSE)

以获取相关的数据,但我不知道如何做多天没有手动select每一天,并进行公式1826次。 请帮忙。 谢谢。

有了这么大的数据集,你想避免数组公式,所以限制Small()或Large()的查找范围的方法更好。

考虑截图和公式的结果。 我在E2中input了第一个date,并使用填充手柄向下拖动并自动递增。 我的date以DMY顺序显示。

在这里输入图像说明

公式是

F2 =LARGE(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),1)

G2 =LARGE(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),2)

H2 =SMALL(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),1)

I2 =SMALL(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),2)

….复制下来。 这种方法要求数据按列B中的date升序排列。

要从列C中返回匹配值,请将公式包含在列C上的索引中,列A上有一个匹配项,例如第二个最小值的时间是

 =INDEX($C:$C,MATCH(SMALL(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),2),$A:$A,0)) 

尝试这个:

![在这里输入图片描述

在E2中唯一的数组公式:

 =IFERROR(INDEX($B$1:$B$10,MATCH(0,IF(COUNTIF($E$1:$E1,$B$1:$B$10)=0,0,1),0)),"") 

这个公式必须用Ctrl-Shift-Enter确认。

在F2中:

 =IF(E2<>"",AGGREGATE(15,6,$A$1:$A$10/($B$1:$B$10=E2),1),"") 

在G2中:

 =IF(E2<>"",INDEX($C$1:$C$10,MATCH(AGGREGATE(15,6,$A$1:$A$10/($B$1:$B$10=E2),1),$A$1:$A$10,0)),"") 

在H2中:

 =IF(E2<>"",AGGREGATE(14,6,$A$1:$A$10/($B$1:$B$10=E2),1),"") 

在I2中:

 =IF(E2<>"",INDEX($C$1:$C$10,MATCH(AGGREGATE(14,6,$A$1:$A$10/($B$1:$B$10=E2),1),$A$1:$A$10,0)),"") 

然后复制下来。 汇总function是在2010年引入的。

然后根据需要复制配方。 在图片中,公式被复制到第15行。

这个方法不关心列表是否被sorting。

如果订购的话比我认为@teylyn的答案是一个更快的计算。

我将此作为另一个答案,而不是试图提供问题的解决scheme,而是因为我想展示我的调查结果,比较指数和以前答案中提供的总计方法之间的计算速度。

build立:

具有500,000行数据的Excel“数据”表,“值”,“date”,“时间”列每个date多次表示。 数据范围从1/1/2000/5 / Apr / 2014。 每天有98个条目。

在另一张表中,列E有5209个date,每行一个date。 在F和G列中使用两个不同的公式来查找“数据”表中每个date的最大值。

列H比较两个公式的输出,单元格K1计算结果中的差异。 没有区别。 两个公式都提供了完全相同的结果。

该表有5209行与公式。 每个公式都会计算500,000行数据。

“索引”栏中的公式是

 =LARGE(INDEX(data!$A:$A,MATCH($E3,data!$B:$B,0)):INDEX(data!$A:$A,MATCH($E3,data!$B:$B,1)),1) 

注意:这种方法取决于按date列升序排列的源数据。 有可能是由一些监视系统产生的数据,这将使一个接一个地读。 除非有人为的或程序性的干预,否则我会认为数据是按datesorting的。

“总计”列中的公式是

 =AGGREGATE(14,6,data!$A$2:$A$500000/(data!$B$2:$B$500000=E2),1) 

目标是找出哪个公式更有效率,即计算速度更快。 我正在使用Charles Williams编写的代码,专门研究公式和VBA的性能。 我已经使用了他的范围计时器,正如在这篇MSDN文章中发表的 。

以下是我的设置的屏幕截图:

在这里输入图像说明

我使用索引公式select了列并运行了三次定时器。 结果在19秒的范围内。

在这里输入图像说明

然后我用Aggregate公式select了列,并运行定时器。 第一个通过了411秒,这是6:52分钟。 第二次传球耗时425秒(7:05分钟)。

在这里输入图像说明

我并没有对总分公式的结果进行第三次传球,因为我的笔记本电脑风扇正在进入超速,变得非常歇斯底里和高调。

为什么我发布这个?

我想提请注意几件事情:

  • 问题中的数据样本通常只包含几行数据
  • 因此,这里build议的公式通常只在一个小的数据样本上进行testing,但在真实环境中使用时可能performance不如预期。
  • build议的指数公式看起来很复杂,相当口。 build议的汇总公式要短得多,看起来更整洁,但是,与索引公式相比,汇总公式更好地执行。 因此: 较短的公式并不总是会导致更快的计算

我的示例文件可以在这里访问,如果你想给它一个旋转。 要知道,它有大约20 MB,因为它有这么多的数据。 要运行macros,请select一个范围,然后单击蓝色button。