如何根据可用性表计算下一天/同一天?

Posted

技术标签:

【中文标题】如何根据可用性表计算下一天/同一天?【英文标题】:How to calculate next/same day based on availability table? 【发布时间】:2019-10-17 00:24:59 【问题描述】:

我正在研究一个 Excel 公式,以根据 Excel 表查找下一个可用日期。我有两个表,A 和 B,表 A 有日期和结果列,表 B 有日期和计数,我想根据表 A 和 B 中的日期计数从表 B 中获取日期到表 A 的结果列. 请注意,表 A 的“结果”列中的日期是预期输出,它始终与表 A 的日期列中的日期相同或更高。日期格式为月/日/年

table A 
Date    Result
01-02-2018  01-02-2018
01-02-2018  01-02-2018
01-05-2018  01-05-2018
01-05-2018  01-05-2018
01-05-2018  01-07-2018
01-05-2018  01-07-2018
01-06-2018  01-07-2018
01-07-2018  01-10-2018
01-09-2018  01-10-2018
01-11-2018  01-12-2018
01-12-2018  01-12-2018


table B 
Date    Count
01-02-2018  3
01-03-2018  1
01-04-2018  3
01-05-2018  2
01-07-2018  3
01-10-2018  3
01-12-2018  2


【问题讨论】:

嗨,表A,“结果”列是预期的输出,它基于表B的“日期”和“计数”列。一个 excel 公式将是理想的,我也可以使用 r 函数。 :) 请详细说明如何根据DateCount返回表A中的日期? 我的意思是一个日期最多可以出现在表 A 结果列是基于表 B 的计数列。例如,对于表 A 中的行 3、4、5,它们的日期列为 01-05-2018 但在表 B 01-05-2018 中的计数为 2,因此结果列的第 3、4 行表 A 的日期为 01-05-2018,第 5 行的下一个日期列在表 B 中,即 01-07-2018。在这里,对于表 A 中的每个日期,结果日期要么是同一日期,要么是下一个更高的日期 表 A 和表 B 中的日期是否总是按升序排列,或者它们可以随机出现,如果没有匹配,你想显示什么?还有您使用的是什么版本的 Excel(这可能会开辟解决问题的新方法)。 两个表中的所有日期都按升序排列,表 A 和 B 之间可能有少数日期不匹配。在这种情况下,您可以看到表 A 中存在日期 01-06-2018 但是不是 B。我在 32 位 Office 365 中使用 excel 【参考方案1】:

这个任务花费了我比预期更长的时间来解决,最后我在几个帮助列的帮助下想出了一个解决方案(不确定是否可以选择?)。

假设您有以下命名范围

TblA_Date 是您Table A 中的所有日期(这是可选的,因为我没有在我的解决方案中使用它...); TblB_Date 是您Table B 中的所有日期。

首先,我将您的Table B“扩展”为一个列出所有日期的列表结构:

我的示例单元格J2 中第一个辅助列的公式是:

=SUM($I$2:I2)

这是在Table B中找到计数的总和。

单元格M2 中第二个辅助列的公式为:

=INDEX(TblB_Date,MATCH(1,--(ROW(A1)<=$J$2:$J$8),0))

使用行位置作为参考“布置”Table B 中的所有日期,并将其与运行的计数总数进行比较并返回相应的日期。鉴于它是一个数组公式,您必须Ctrl+Shift+Enter完成公式栏中的公式后,否则它将无法正常工作。然后,您只需将公式向下拖动即可应用。

请注意,我已为第二个辅助列 M2:M18(不包括错误的 M19)命名为 TblB_Date_Expanded

下一步是根据您的条件在 TblB_Date_Expanded 中找到所需日期的位置

    "对于表 A 中的每个日期,结果日期要么是同一日期,要么是下一个更高的日期" AND 来自Table B 的日期只能使用不超过其相应的计数

单元格E2中的公式为:

=MAX(MATCH(AGGREGATE(15,6,TblB_Date_Expanded/(A2<=TblB_Date_Expanded),1),TblB_Date_Expanded,0),E1+1)

A2Table A 中的第一个日期,您将在我的下一个屏幕截图中看到。

逻辑是使用AGGREGATE函数根据Table A中的给定日期返回TblB_Date_Expanded中最接近的开始日期,然后使用MATCH函数返回行位置,最后使用 MAX 函数将位置增加1,如果已经使用了相同的位置(在上面的行中)。

有了已知的行位置,我们可以很容易地使用以下公式从TblB_Date_Expanded返回对应的日期:

=INDEX(TblB_Date_Expanded,E2)

思考,我无法克服的困难部分是在辅助列中使用“循环引用”或“自我引用”。换句话说,我不确定如何使用单个公式返回一个值数组,其计算取决于其先例值。我希望有人能想出一个更优雅的方法来解决这个问题:)

如果您有任何问题,请告诉我。干杯:)

【讨论】:

嗨特里,我知道这是一个有点棘手的问题,很高兴你明白了。这非常有效,我真的很感激。 @user12229564 乐于提供帮助。我没有太多时间来测试结果,所以如果您遇到任何异常,请告诉我,我会尽快查看。【参考方案2】:

假设“A表”放在A1:A9中,包括A1:“表A”,A2:B2(表头):“日期”和“结果”

“table B”放入A11:A1,包括A11:“table B”,A12:B12(header):“Date”和“Count”

在“结果”列B3,复制下来的公式:

=IF(COUNTIF(A$3:A3,A3)<=IFERROR(VLOOKUP(A3,$A$13:$B$17,2,0),0),A3,AGGREGATE(15,6,$A$13:$A$17/($A$13:$A$17>=MAX(A3,INDEX(A3:A$10,MATCH(1,INDEX(0+(A3:A$10<>A3),0),0)))),1))

【讨论】:

您好,感谢您的回复。我已经尝试过这个公式并且它部分正确,但是对于问题中列出的示例它不起作用,想添加日期格式是月/日/年。 我把“表A”放在A1:A13中,包括A1:“表A”,A2:B2(标题):“日期”和“结果”,“表B”放在A16中: A24, 包括 A16: "table B", A17:B17 (header) : "Date" 和 "Count" , 结果公式在 B3 =IF(COUNTIF(A$3:A3,A3)=MAX(A3,INDEX(A3:A) $13,MATCH(1,INDEX(0+(A3:A$13A3),0),0)))),1)) 根据您发布的示例,请说明哪个公式单元格结果与您的预期不匹配。请注意,我的公式使用了自 Excel 2010 起可用的 AGGREGATE 函数,较低的 Excel 版本将无法工作。 对于第 8 行 01-07-2018,我应该得到 01-10-2018 的答案,但我得到了 01-07-2018,虽然表 B 中的计数是设置为 3,日期为 01-07-2018。 不要在没有通知的情况下改变你的目标帖子,这是你第三次改变你的帖子原始数据。抱歉,无法为您提供任何帮助。

以上是关于如何根据可用性表计算下一天/同一天?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据某些过滤条件从 bigquery 导出数据

如何根据事件日志表在一天结束时获取每个状态的用户总数?

如何在 DatePicker 中使一周中的某些天不可用

每日一答:HDFS的使用量达到百分之多少的时候需要扩容?

根据年,月,周,计算具体的某一天(星期一)

Javascript计算前一天和后一天