根据条件查找前N行-动态LAG

问题描述

我有这个sql挑战 我有一张看起来像这样的桌子(我刚从网站上收到一条消息,说我不能在此处发布图片,所以请使用链接

enter image description here

面临的挑战是确定NEW_BATCH_FLAG = 1的值的最近第N行,并为NEW_BATCH_FLAG = 0(直到耕种)的所有后续行“散布” THAT行的“当前交易日期”的值我们将在下一行遇到NEW_BATCH_FLAG = 1)

您可以(希望:))在图像中看到,第一行的NEW_BATCH_FLAG = 1,因此我应该“传播”日期为第二个日期(2020年6月1日),其中第二行NEW_BATCH_FLAG = 0,问题是,对于第一个,我必须往后退一排,对于第二个,我必须往后退两排。

因此,挑战在于为每个给定的行计算-在我打到最近的NEW_BATCH_FLAG = 1行之前,我必须返回多少行。

此“距离”将在LAG函数中进一步用作偏移量的参数。

解决方法

一种方法是使用标量子查询,但是效率不高:

select t1.transaction_date,t1.new_batch_flag,case new_batch_flag
          when 1 then t1.transaction_date
          else (select max(t2.transaction_date)
                from the_table t2
                where t2.new_batch_flag = 1
                  and t2.transaction_date < t1.transaction_date)
       end as start_date_of_batch
from the_table t1;

Online example

使用Postgres,我会这样:

select transaction_date,new_batch_flag,case new_batch_flag
          when 1 then transaction_date
          else max(transaction_date) filter (where new_batch_flag = 1) over (order by transaction_date)
       end as start_of_batch
from the_table;

Online example

,

我认为您只需要一些条件逻辑的累积最大值:

select t.*,max(case when new_batch_flag = 1 then transaction_date end) over (order by transaction_date) as start_date_of_batch
from t;