【问题标题】:search within a list of dates and find the next closest future date在日期列表中搜索并找到下一个最近的未来日期
【发布时间】:2022-10-14 02:56:01
【问题描述】:

问题:

给定一个支付周期和销售日期的列表。对于每个销售日期,确定下一个发薪日。

Pay periods (given) Sale date (given) Pay day (To be generated)
June 4 June 4 June 4
June 17 June 4 June 4
June 30 June 4 June 4
July 15 June 5 June 17
June 5 June 17
June 12 June 17
June 16 June 17
June 18 June 30
June 22 June 30
June 24 June 30
June 28 June 30
June 30 June 30
July 1 July 15
July 7 July 15
July 8 July 15
July 9 July 15
July 10 July 15

Google Sheets: Yellow = given data, Blue = answer to be generated


我得到的最近的:

=arrayformula(过滤器($A$2:$A,abs($A$2:$A-B2)=min(abs($A$2:$A-B2))))

这个公式是不正确的,因为对于某些销售日期,发薪日更早。销售日期必须始终在发薪日之前,因为在现实生活中,您只有在完成销售后才能获得报酬,而不是之前。

【问题讨论】:

    标签: google-sheets google-sheets-formula


    【解决方案1】:

    尝试:

    =BYROW(B2:B, LAMBDA(x, SINGLE(FILTER(A2:A, A2:A>=x))))
    

    或从另一个选项卡:

    =BYROW(B2:B, LAMBDA(x, SINGLE(FILTER('New tab'!A2:A, 'New tab'!A2:A>=x))))
    

    【讨论】:

    • 非常巧妙的解决方案。 ? 我会在 FILTER() 周围抛出一个 SORT() 以避免在未订购付款日期时出现问题。
    • 非常有效率!如果销售日期为空白,有没有办法让公式停止任何输出?例如,在谷歌表格中,您可以看到 John 的方法在销售日期为空白时停止,但此方法在销售日期为空白时继续输出“7 月 4 日”。
    • 我添加了数组公式并检查您的公式之前的销售日期是否为空白。这似乎可行,但有什么可以提高效率的吗? "=ARRAYFORMULA(if(B2:B="",,BYROW(B2:B, LAMBDA(x, SINGLE(FILTER('新标签'!A2:A, '新标签'!A2:A>=x)) ))))”
    【解决方案2】:

    如果“付款日期”按升序排列,您可以尝试以下公式:

    G2 = arrayformula(INDEX($A$2:$A$5,MATCH(MIN(ABS($A$2:$A$5-B2)),ABS($A$2:$A$5-B2),0)))
    
    H2 = index($A$2:$A$5,match($G2,$A$2:$A$5)+1)
    
    I2 = if(G2<B2,H2,G2)
    

    然后:

    F2 = if(arrayformula(INDEX($A$2:$A$5,MATCH(MIN(ABS($A$2:$A$5-B2)),ABS($A$2:$A$5-B2),0)))<B2,index($A$2:$A$5,match(arrayformula(INDEX($A$2:$A$5,MATCH(MIN(ABS($A$2:$A$5-B2)),ABS($A$2:$A$5-B2),0))),$A$2:$A$5)+1),arrayformula(INDEX($A$2:$A$5,MATCH(MIN(ABS($A$2:$A$5-B2)),ABS($A$2:$A$5-B2),0))))
    

    希望它会有所帮助。

    【讨论】:

    【解决方案3】:

    我是 SQL 的粉丝,所以这里有一个使用 QUERY() 的直观解决方案:

    =BYROW(B2:B, LAMBDA(x, 
        QUERY(
            A:A, "
            SELECT 
                A 
            WHERE 
                A >= DATE '"&TEXT(x, "yyyy-mm-dd")&"' 
            ORDER BY 
                A 
            LIMIT 
                1 
            LABEL 
                A ''
            "
            , 1)
        ))
    

    我把它扔进了你的谷歌表格,这样你就可以看到它的实际效果了!

    编辑:我将它包裹在BYROW() 中,因此如果需要,您可以在一个单元格中使用它。

    【讨论】:

    • 如果支付周期(给定)不在同一张纸上怎么办?如果在另一个名为“新标签”的工作表上怎么办?在 SQL 中,你能把 A 替换为 'New tab'!A
    • 只需将查询范围A:A 更改为'New tab'!A:A。除非列字母更改,否则无需更改 SQL 中的任何内容。
    • 这很好用,约翰!另外,有没有办法通过在第一行输入公式来提高效率......然后对于下面的所有行,计算是自动填充的? IE。使用 ArrayFormula、Byrow 或索引?
    • @唐是的。刚刚编辑了我的答案以反映您对此的渴望。
    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多