对于列值相等的每个组获取大和小,并返回第三列值
我有大量的数据(大约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。