如何在减少 SQL 之前的几个月内使收入为 0 美元?
How to make revenue $0 for months prior to decrease in SQL?
我有以下数据:
client_id
balance_month
balance
100000000
September 1,2021 12:00 AM
0
100000000
August 1,2021 12:00 AM
0
100000000
July 1,2021 12:00 AM
0
100000000
June 1,2021 12:00 AM
0
200000000
September 1,2021 12:00 AM
200000000
August 1,2021 12:00 AM
0
200000000
July 1,2021 12:00 AM
0
200000000
June 1,2021 12:00 AM
0
使余额减少的最近一个月之前的所有前几个月的最有效方法是 0 美元,这样:
client_id
balance_month
balance
100000000
September 1,2021 12:00 AM
0
100000000
August 1,2021 12:00 AM
0
100000000
July 1,2021 12:00 AM
[=12=]
100000000
June 1,2021 12:00 AM
[=12=]
200000000
September 1,2021 12:00 AM
200000000
August 1,2021 12:00 AM
[=12=]
200000000
July 1,2021 12:00 AM
[=12=]
200000000
June 1,2021 12:00 AM
[=12=]
您可以使用 lag()
获取减少,然后使用 window 函数获取日期:
select t.*,
(case when balance_date > first_decrease_balance_date
then 0
else balance
end) as new_balance
from (select t.*,
min(case when prev_balance > balance then balance_date end) over (partition by client) as first_decrease_balance_date
from (select t.*,
lag(balance) over (partition by client_id order by balance_month) as prev_balance
from t
) t
) t;
您可以使用 LAG() window 函数检查余额是否减少,使用 MAX() window 函数检查最后一次减少发生的时间:
SELECT client_id, balance_month,
CASE
WHEN balance_month <
MAX(CASE WHEN prev_balance > balance THEN balance_month END) OVER (PARTITION BY client_id)
THEN 0
ELSE balance
END balance
FROM (
SELECT *, LAG(balance, 1, balance) OVER (PARTITION BY client_id ORDER BY balance_month) prev_balance
FROM tablename
) t
ORDER BY client_id, balance_month DESC;
参见demo。
我有以下数据:
client_id | balance_month | balance |
---|---|---|
100000000 | September 1,2021 12:00 AM | 0 |
100000000 | August 1,2021 12:00 AM | 0 |
100000000 | July 1,2021 12:00 AM | 0 |
100000000 | June 1,2021 12:00 AM | 0 |
200000000 | September 1,2021 12:00 AM | |
200000000 | August 1,2021 12:00 AM | 0 |
200000000 | July 1,2021 12:00 AM | 0 |
200000000 | June 1,2021 12:00 AM | 0 |
使余额减少的最近一个月之前的所有前几个月的最有效方法是 0 美元,这样:
client_id | balance_month | balance |
---|---|---|
100000000 | September 1,2021 12:00 AM | 0 |
100000000 | August 1,2021 12:00 AM | 0 |
100000000 | July 1,2021 12:00 AM | [=12=] |
100000000 | June 1,2021 12:00 AM | [=12=] |
200000000 | September 1,2021 12:00 AM | |
200000000 | August 1,2021 12:00 AM | [=12=] |
200000000 | July 1,2021 12:00 AM | [=12=] |
200000000 | June 1,2021 12:00 AM | [=12=] |
您可以使用 lag()
获取减少,然后使用 window 函数获取日期:
select t.*,
(case when balance_date > first_decrease_balance_date
then 0
else balance
end) as new_balance
from (select t.*,
min(case when prev_balance > balance then balance_date end) over (partition by client) as first_decrease_balance_date
from (select t.*,
lag(balance) over (partition by client_id order by balance_month) as prev_balance
from t
) t
) t;
您可以使用 LAG() window 函数检查余额是否减少,使用 MAX() window 函数检查最后一次减少发生的时间:
SELECT client_id, balance_month,
CASE
WHEN balance_month <
MAX(CASE WHEN prev_balance > balance THEN balance_month END) OVER (PARTITION BY client_id)
THEN 0
ELSE balance
END balance
FROM (
SELECT *, LAG(balance, 1, balance) OVER (PARTITION BY client_id ORDER BY balance_month) prev_balance
FROM tablename
) t
ORDER BY client_id, balance_month DESC;
参见demo。