Redshift PostgreSQL窗口函数 - 保留最近的非null值

时间:2015-01-22 16:56:41

标签: aggregate-functions amazon-redshift

这是我的数据:

+--------+------------+---------+------------+----------------+
| 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 - 这就是我想要的

我想我必须使用窗口函数,但是我不知道如何保持最新的非null值,即使最近的非null值是很多行之前。

例如,我尝试过类似的事情:

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 |            |                |
+--------+------------+---------+------------+----------------+

有没有办法使用窗口函数说"保留最新的,如果它是null,假设它没有从之前的非空值改变"?

1 个答案:

答案 0 :(得分: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;