当另一列不为 NULL 时,lead() return 下一个值可以吗?
Can lead() return next value when another column is not NULL?
我尽了最大的努力,但我似乎仍然无法做到这一点。
查看下面的 table,您可以想到某家公司在哪个工作日交货以及他们用于接收订单的各种截止时间。简单地说,我希望“desired_outcome(下一次交货)”根据 cutoff1 不为空的时间显示下一次交货的工作日。
所以以公司 A 为例,如果要在星期日晚于 20:00 下订单,那么它将在星期一交付,因为他们在星期一交货(cutoff1 不为空) .但是,如果有人在 23:30 之后的星期一或星期二的任何时候下订单,他们将不得不等到星期三公司再次发货。如果客户要在周六 18:00 之后下订单,他们将不得不等到周日。这里的问题是我曾尝试使用 LEAD() 但它只会获取下一个值,即使 cutoff1 为空时也是如此。我希望函数获取 cutoff1 不为 null 的“下一个”工作日,所以它几乎是一个窗口函数(lead),但有条件。仅当 cutoff1 不为空时才给我下一个值。当它位于最后一行的 lead () returns null 时,我需要它“从列表的开头开始”并获取 cutoff 不为 null 的第一个工作日。
有什么想法:)?这真的让我费尽心思。
示例:
Merchant_name
weekday
cutoff1
cutoff2
cutoff3
desired_outcome (next delivery)
Company A
0
13:00
15:00
20:00
1
Company A
1
13:00
15:00
23:30
3
Company A
2
NULL
NULL
NULL
3
Company A
3
13:00
15:00
19:00
4
Company A
4
13:00
15:00
18:00
5
Company A
5
13:00
15:00
18:00
6
Company A
6
13:00
15:00
18:00
0
Company B
0
NULL
NULL
NULL
1
Company B
1
13:00
15:00
23:30
3
Company B
2
NULL
NULL
NULL
3
Company B
3
13:00
15:00
19:00
5
Company B
4
NULL
NULL
NULL
5
Company B
5
13:00
15:00
18:00
6
Company B
6
13:00
15:00
18:00
1
可能以下是您需要的,使用相关子查询 select 下一个符合条件的工作日:
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;
我尽了最大的努力,但我似乎仍然无法做到这一点。
查看下面的 table,您可以想到某家公司在哪个工作日交货以及他们用于接收订单的各种截止时间。简单地说,我希望“desired_outcome(下一次交货)”根据 cutoff1 不为空的时间显示下一次交货的工作日。
所以以公司 A 为例,如果要在星期日晚于 20:00 下订单,那么它将在星期一交付,因为他们在星期一交货(cutoff1 不为空) .但是,如果有人在 23:30 之后的星期一或星期二的任何时候下订单,他们将不得不等到星期三公司再次发货。如果客户要在周六 18:00 之后下订单,他们将不得不等到周日。这里的问题是我曾尝试使用 LEAD() 但它只会获取下一个值,即使 cutoff1 为空时也是如此。我希望函数获取 cutoff1 不为 null 的“下一个”工作日,所以它几乎是一个窗口函数(lead),但有条件。仅当 cutoff1 不为空时才给我下一个值。当它位于最后一行的 lead () returns null 时,我需要它“从列表的开头开始”并获取 cutoff 不为 null 的第一个工作日。
有什么想法:)?这真的让我费尽心思。
示例:
Merchant_name | weekday | cutoff1 | cutoff2 | cutoff3 | desired_outcome (next delivery) |
---|---|---|---|---|---|
Company A | 0 | 13:00 | 15:00 | 20:00 | 1 |
Company A | 1 | 13:00 | 15:00 | 23:30 | 3 |
Company A | 2 | NULL | NULL | NULL | 3 |
Company A | 3 | 13:00 | 15:00 | 19:00 | 4 |
Company A | 4 | 13:00 | 15:00 | 18:00 | 5 |
Company A | 5 | 13:00 | 15:00 | 18:00 | 6 |
Company A | 6 | 13:00 | 15:00 | 18:00 | 0 |
Company B | 0 | NULL | NULL | NULL | 1 |
Company B | 1 | 13:00 | 15:00 | 23:30 | 3 |
Company B | 2 | NULL | NULL | NULL | 3 |
Company B | 3 | 13:00 | 15:00 | 19:00 | 5 |
Company B | 4 | NULL | NULL | NULL | 5 |
Company B | 5 | 13:00 | 15:00 | 18:00 | 6 |
Company B | 6 | 13:00 | 15:00 | 18:00 | 1 |
可能以下是您需要的,使用相关子查询 select 下一个符合条件的工作日:
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;