【发布时间】:2021-09-11 14:57:54
【问题描述】:
我有一项任务需要选择由同一 id_user 完成的先前充值 date 和 promo_id = Y。我仍然是 SQL 的初学者,所以我发现完成这项任务很困难。
我尝试使用LAG()窗口函数但不知道如何将偏移值更改为变量而不是数字。
非常感谢!
表topups
id_user | date | promo_id
---------+------------+----------
1 | 2017-06-20 | N
1 | 2017-05-20 | N
1 | 2017-04-20 | Y
1 | 2017-03-20 | Y
1 | 2017-02-20 | N
预期结果
id_user | date | promo_id | prv_qual_topup_dt
---------+------------+----------+-------------------
1 | 2017-06-20 | N | 2017-04-20
1 | 2017-05-20 | N | 2017-04-20
1 | 2017-04-20 | Y | 2017-03-20
1 | 2017-03-20 | Y | NULL
1 | 2017-02-20 | N | NULL
【问题讨论】:
-
看看Conditional lead/lag function PostgreSQL? - 显然,因为 Postgres 13 你可以只使用
LAG(date) OVER (ORDER BY date) FILTER (WHERE promo_id = 'Y') -
@Bergi 是否已经有
filter支持纯窗口函数(非聚合)? -
@JimJones 我不知道,但链接问题的答案是“
FILTER不适用于lead()或lag()等纯正版函数(最多 Postgres 13)”,我相信欧文。 -
@Bergi 我明白了。他可能弄错了(这让我感到惊讶).. 我的 pg13.3 说 “错误:FILTER 未针对非聚合窗口函数实现”。有那么一瞬间我很兴奋:-D
-
@Bergi 我尝试添加 FILTER,但出现了 Jim Jones 指出的错误。
标签: sql postgresql window-functions