【问题标题】:How to select the previous date with a condition如何使用条件选择上一个日期
【发布时间】:2021-09-11 14:57:54
【问题描述】:

我有一项任务需要选择由同一 id_user 完成的先前充值 datepromo_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


【解决方案1】:

在这种情况下,子查询可能比窗口函数更简单:

SELECT *,(
 SELECT max(date) FROM topups q2 
 WHERE id_user = q.id_user AND 
       q2.promo_id = 'Y' AND 
       q.date > q2.date)
FROM topups q ORDER BY date DESC;

 id_user |    date    | promo_id |    max     
---------+------------+----------+------------
       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        | 
       1 | 2017-02-20 | N        | 
(5 rows)

演示:db<>fiddle

【讨论】:

  • 谢谢! qq2 是 topups 表的别名吗?
  • 如何重复使用这个表?我无法将WITH table AS 添加到此查询的开头。
  • 重复使用表是什么意思?
  • 您好,我想将此 SELECT 语句嵌套在另一个使用 WITH table_name AS 的 SELECT 语句中,但由于与别名 q 冲突而出现错误。抱歉,我是 SQL 新手,没有太多使用别名。
  • @HangNguyen 我明白了。您应该发布一个新问题。否则很难完全理解您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多