我正在尽我最大的努力,但我似乎仍然无法做到这一点。
看看下表,你可以想到某家公司在工作日的交货时间,以及他们收到订单时使用的各种截止时间。简单地说,我想要";desired_outcome(下一次递送(";根据cutoff1不为空的时间,显示下一次交货的工作日。
因此,以A公司为例,如果订单在周日20:00之后下,则会在周一交付,因为他们在周一交付(cutoff 1不为空(。然而,如果有人在周一23:30后或周二的任何时候下单,他们将不得不等到周三公司再次发货。如果客户在周六18:00之后下单,他们将不得不等到周日。这里的问题是,我尝试过使用LEAD((,但这只会获取下一个值,即使cutoff1为null。我希望函数获取";下一个";cutoff1不为空的工作日,所以这几乎是一个窗口函数(lead(,但有条件。只有当cutoff1不为空时,才给我下一个值。当lead((在最后一行返回null时,我需要它";从列表的开头开始";并且获取截止不为空的第一个工作日。
有什么想法吗?这真让我头疼。
示例:
Merchant_name | 工作日 | cutoff1cutoff2 | >cutoff3>1desired_outcome(下一次交付( | [/tr>|||
---|---|---|---|---|---|---|
公司A | 0 | 13:00 | 15:00 | 20:00 | 1||
公司A | 1 | 13:00 | 15:00 | 23:30 | >3 | |
公司A | 2 | NULL | NULL | 3 | ||
公司A | 3 | 13:00 | 15:00 | 19:00 | 4 | |
公司A | 4 | 13:00 | <15:00>5 | |||
公司A | 5 | 13:00 | 15:00 | 18:00 | >6 | |
公司A | 6 | 13:00<15:00>18:00 | >0 | |||
公司B | 0 | NULL | NULL | 1 | ||
公司B | 1 | 13:00 | 15:00 | 23:30 | >3 | |
公司B | 2 | NULL | NULL | 3 | ||
公司B | 3 | 13:00 | 15:00 | 19:00 | >5 | |
公司B | 4 | NULL | NULL | 5 | ||
公司B | 5 | 13:00 | 15:00 | 18:00 | >6 | |
公司B | 6 | 13:00 | 15:00 | 18:00 | 1
您可能需要以下内容,使用相关子查询来选择下一个符合条件的工作日:
select *, (
select Coalesce(Min(case when t2.weekday > t.weekday then t2.weekday end) over(), t2.weekday)
from t t2
where t2.Merchant_name=t.Merchant_name
and t2.cutoff1 is not null
limit 1
) Outcome
from t;