首页 > 解决方案 > 如何将 LAG 函数与 WHERE 子句结合使用?

问题描述

我想使用 LAG 函数来显示之前的可用金额,但是当之前的可用金额的 value_date 为“reimbursment”时,它将继续使用非报销类型的最后一个

这意味着 LAG 应应用于 previous_availability 字段,如下所示:

价值日期 未来可用性 以前的可用性 精确日期
当前 EOD 10 无效的 2020-12-18
报销 2 10 2020-12-19
报销 3 10 2020-12-20
报销 4 10 2020-12-22
报销 5 10 2022-01-18
利用率 6 10 2022-01-19
报销 7 6 2022-03-18
期限到期 8 6 2022-07-18
报销 9 8 2025-01-01

谢谢!

标签: sqlsql-server

解决方案


(注意:这是在precise_date 添加到问题之前发布的)

如果你有一个索引id

-- drop table mytable;
create table mytable (
  id integer,
  value_date varchar(20),
  future_availability integer);

insert into mytable values
(1,'Current EOD',             10),
(2,'reimbursment',            2 ),
(3,'reimbursment',            3 ),                       
(4,'reimbursment',            4 ),
(5,'reimbursment',            5 ),
(6,'utilization',             6 ),
(7,'reimbursment',            7 ),
(8,'Limit Maturity',          8 ),
(9,'reimbursment',            9 );


select 
   value_date, 
   future_availability,
   (select TOP 1 m2.future_availability 
    from mytable m2 
    where m2.id<m1.id and m2.value_date<>'reimbursment' 
    order by id desc
    ) as previous_availability
from mytable m1;

输出将是:

+ --------------- + ------------------------ + -------------------------- +
| value_date      | future_availability      | previous_availability      |
+ --------------- + ------------------------ + -------------------------- +
| Current EOD     | 10                       |                            |
| reimbursment    | 2                        | 10                         |
| reimbursment    | 3                        | 10                         |
| reimbursment    | 4                        | 10                         |
| reimbursment    | 5                        | 10                         |
| utilization     | 6                        | 10                         |
| reimbursment    | 7                        | 6                          |
| Limit Maturity  | 8                        | 6                          |
| reimbursment    | 9                        | 8                          |
+ --------------- + ------------------------ + -------------------------- +

但是是没有使用该LAG功能。

编辑:删除limit 1和添加TOP 1,因为这是关于 MSSQL。


推荐阅读