如何通过行值的负值检索与当前记录分区最接近的记录

Posted

技术标签:

【中文标题】如何通过行值的负值检索与当前记录分区最接近的记录【英文标题】:How to retrieve the record closest in time to current record partitioning by the negative of the row value 【发布时间】:2020-07-07 21:42:03 【问题描述】:

我有一份代表库存更正的记录列表。对于每条记录,我想找到相应的负值记录并了解它们之间的接近程度。

例如,如果给定行的corrected_quantity 为-4。我想找到最近的 +4 行并查找 created_time 列以了解这两个操作之间的时间间隔。

(lag(created_time,1) over (partition by it.product_id,abs(quantity_change),sign(quantity_change) order by created_time asc)) as previous_correction,
(lag(created_time,-1) over (partition by it.product_id,abs(quantity_change),sign(quantity_change) order by created_time asc)) as subsequent_correction

这个滞后函数的问题是它显然将 -4 转换为 +4,因此最终会找到具有 +4 校正数量的行 - 这不是我需要的。

数据看起来像这样:(对不起,我不知道如何将其格式化为表格)

CREATED_TIME                    QUANTITY_CHANGE
2020-07-07 12:42:59.901 +0000      -12
2020-07-07 12:42:04.916 +0000       12
2020-07-07 11:51:57.236 +0000       40
2020-07-07 11:51:57.223 +0000       -40
2020-07-07 06:46:32.955 +0000       3
2020-07-07 06:46:10.592 +0000       -3

【问题讨论】:

【参考方案1】:

如果您正在寻找之前的最大时间,您可以使用累积条件最大值:

select max(case when quantity_change < 0 then created_time end) over
           (partition by product_id, abs(quantity_change)
            order by created_time
           )

如果您想对正值和负值都执行此操作,请使用case

select (case when quantity_change > 0
             then max(case when quantity_change < 0 then created_time end) over
                      (partition by product_id, abs(quantity_change)
                       order by created_time
                      )
             else max(case when quantity_change > 0 then created_time end) over
                      (partition by product_id, abs(quantity_change)
                       order by created_time
                      )
        end)

【讨论】:

感谢您的回复。问题是我不是在寻找最大值或最小值,而是在时间上最接近的记录。例如,在遥远的过去,可能会有另一个调整 -4,此代码将作为答案。 @SéamusBeirne 。 . .这将返回与时间最接近的时间戳。如果你想要完整的记录,你可以join那个信息回来。 我对您的代码的唯一问题是它似乎无法展望未来以获得最接近的修正。例如。如果在给定的更正之后发生相反的更正,我希望将其分配给它。有没有办法改变代码来解决这个问题? 我刚刚复制并粘贴了您的代码并将最大值更改为最小值并由desc 订购,这有助于我在未来获得最接近的更正。然后我用timestampdiff完成了least,以找到最接近的。 @SéamusBeirne 。 . .您的查询使用lag(),所以我认为您想要给定行之前最接近的值。

以上是关于如何通过行值的负值检索与当前记录分区最接近的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何用R将列中相同值的行值分组? [复制]

数据系统分区设计 - 分区与二级索引

计算前几行中大于当前行值的值

如何编写一个 solr 查询来检索数字字段值小于指定值的所有记录?

选择不包含任何负值或缺失值的行

SQL查询:要求明细记录里边总额要大于等于并最接近指定的数值