问题描述
我有这个sql挑战 我有一张看起来像这样的桌子(我刚从网站上收到一条消息,说我不能在此处发布图片,所以请使用链接)
面临的挑战是确定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;
使用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;
,
我认为您只需要一些条件逻辑的累积最大值:
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;