SQL-重复最后一个已知值直到昨天

时间:2019-02-01 16:37:17

标签: sql amazon-redshift common-table-expression

我有一个带有日期,ID和值的表。对于某些ID,我没有到昨天为止的值。我需要为每个ID重复最后一个已知值,直到昨天它为NULL。 我已经使用CTE填充2个非NULL值之间的NULL值,但是直到昨天才起作用。 数据如下:

.scroll::-webkit-scrollbar {
    width: 10px;
    background-color: $gray-100;
}

我尝试了以下代码,但未成功:

+-----------+-----+-------+
|   Date    | ID  | Value |
+-----------+-----+-------+
| 1/25/2019 | 111 |    50 |
| 1/26/2019 | 111 |   100 |
| 1/27/2019 | 111 |   150 |
| 1/25/2019 | 222 |   500 |
| 1/26/2019 | 222 |  1000 |
| 1/27/2019 | 222 |  1500 |
+-----------+-----+-------+

这是预期的结果:

WITH CAwithnext AS (
  SELECT
    *,
    LEAD("date") OVER (PARTITION BY "id" ORDER BY "date") AS "NextValue"
  FROM "transform_data_1"
  )
SELECT
    c."Date",
    ig."id",
    ig."value"
FROM "calendar_from_2015_to_2025" AS c
JOIN "CAwithnext" AS ig
    ON c."Date" BETWEEN ig."date" AND ISNULL(DATEADD(day,-1,ig."NextValue"),ig."date")
;

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在提供的查询中,当日期是id的最后可用日期时,您的lead(“ NextValue”)返回的下一个日期将是NULL。要在“ NextValue”为NULL时填满直到昨天,您将需要更改ISNULL,以便用昨天的日期替换NULL

当前使用的方式,当“ NextValue”为null时,它将返回原始日期,这意味着对于任何id系列中的最后一个值,它将仅连接到您的日历表中原始条目的确切ig.date值。

例如,对于ID = 111,最后日期是19/1/27,因此该行的“ NextValue”将是NULL。如果您直接从CTE中选择,您应该会看到类似以下内容的

ID    Date    NextValue
111   1/26/18 1/27/19
111   1/27/19 NULL

当您加入日历时,您的ISNULL有效地将您的加入条件变成on c.Date between 1/27/19 and isnull(NULL, 1/27/19)on c.Date between 1/27/19 and 1/27/19,这就是为什么您只为上一次输入返回一行的原因。

要解决,请从以下位置更改查询的最后一行:

ISNULL(DATEADD(day,-1,ig."NextValue"),ig."date")

ISNULL(DATEADD(day,-1,ig."NextValue"),DATEADD(day,-1,GetDate()))

DATEADD(day,-1,ISNULL(ig."NextValue", GetDate()))

(基本上,将ig.date替换为一个函数,该函数返回您希望其填充的日期;即昨天)。