如何在减少 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