我有一个带有日期,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")
;
感谢您的帮助。
答案 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
替换为一个函数,该函数返回您希望其填充的日期;即昨天)。