【问题标题】:Redshift PostgreSQL window function - keep most recent non-null valueRedshift PostgreSQL 窗口函数 - 保留最新的非空值
【发布时间】:2015-01-22 16:56:41
【问题描述】:

这是我的数据:

+--------+------------+---------+------------+----------------+
| UserID | VisitDate  | VisitID | PurchaseID | LastPurchaseID |
+--------+------------+---------+------------+----------------+
|   1234 | 2014-10-03 |       1 | 4a75       | 4a75           |
|   1234 | 2014-10-06 |       2 |            | 4a75           |
|   1234 | 2014-10-07 |       3 | b305       | b305           |
|   1234 | 2014-10-08 |       4 |            | b305           |
|   1234 | 2014-10-09 |       5 |            | b305           |
|   1234 | 2014-10-10 |       6 | b305       | b305           |
|   1234 | 2014-10-10 |       7 |            | b305           |
|   1234 | 2014-10-15 |       8 |            | b305           |
+--------+------------+---------+------------+----------------+

我没有 LastPurchaseID - 这就是我想要的

我想我必须使用窗口函数,但我不确定如何让它保留最近的非空值,即使最近的非空值是很多行之前的。

例如,我尝试过类似的方法:

SELECT UserID,
       VisitDate,
       VisitID,
       PurchaseID,
       LAG(TRIM(PurchaseID)) IGNORE NULLS
           OVER (ORDER BY UserID, VisitDate) AS LastPurchaseID
FROM TheTable;

但这只会返回:

+--------+------------+---------+------------+----------------+
| UserID | VisitDate  | VisitID | PurchaseID | LastPurchaseID |
+--------+------------+---------+------------+----------------+
|   1234 | 2014-10-03 |       1 | 4a75       | 4a75           |
|   1234 | 2014-10-06 |       2 |            | 4a75           |
|   1234 | 2014-10-07 |       3 | b305       | b305           |
|   1234 | 2014-10-08 |       4 |            | b305           |
|   1234 | 2014-10-09 |       5 |            |                |
|   1234 | 2014-10-10 |       6 | b305       | b305           |
|   1234 | 2014-10-10 |       7 |            | b305           |
|   1234 | 2014-10-15 |       8 |            |                |
+--------+------------+---------+------------+----------------+

有没有办法使用窗口函数说“保持最新,如果它是空的,假设它没有从以前的非空值改变”?

【问题讨论】:

    标签: aggregate-functions amazon-redshift


    【解决方案1】:

    我终于明白了,对此感到抱歉。对于处于这种有些特殊情况的其他人来说,这就是正在发生的事情:

    由于在我的情况下PurchaseID 是一个字符串,我没有考虑PurchaseID 是一个空字符串(或只是一个空格,trim() 变成空字符串)的情况,这不是空。

    我已经修复了插入表中的作业以防止这种情况发生,并将 LastPurchaseID 逻辑更改为以下内容:

    SELECT LAG(CASE WHEN LENGTH(TRIM(PurchaseID)) = 0 THEN NULL
                    ELSE TRIM(PurchaseID) END)
               IGNORE NULLS OVER (ORDER BY UserID, VisitDate) AS LastPurchaseID
    FROM TheTable;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多