SQL - 重复直到昨天的最后一个已知值
SQL - Repeat the last known value until yesterday
我有一个带有日期、ID 和值的 table。对于某些ID,我没有到昨天为止的值。我需要重复每个 ID 的最后一个已知值,直到昨天它为 NULL。
我已经使用 CTE 来填充 2 个非 NULL 值之间的 NULL 值,但它直到昨天才起作用。
数据如下所示:
+-----------+-----+-------+
| 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")
;
这是预期的结果:
+-----------+-----+-------+
| Date | ID | Value |
+-----------+-----+-------+
| 1/25/2019 | 111 | 50 |
| 1/26/2019 | 111 | 100 |
| 1/27/2019 | 111 | 150 |
| 1/28/2019 | 111 | 150 |
| 1/29/2019 | 111 | 150 |
| 1/30/2019 | 111 | 150 |
| 1/31/2019 | 111 | 150 |
| 1/25/2019 | 222 | 500 |
| 1/26/2019 | 222 | 1000 |
| 1/27/2019 | 222 | 1500 |
| 1/28/2019 | 222 | 1500 |
| 1/29/2019 | 222 | 1500 |
| 1/30/2019 | 222 | 1500 |
| 1/31/2019 | 222 | 1500 |
+-----------+-----+-------+
感谢您的帮助。
在提供的查询中,如果某个日期是 id
的最后可用日期,则您的 lead
("NextValue") 返回的下一个日期将是 NULL
.要一直填写到昨天 "NextValue" 为 NULL
时,您需要更改 ISNULL
以将 NULL
替换为昨天的日期。
你目前的方式,当 "NextValue" 为 null 时,它 returns 原始日期,这意味着对于任何 id
系列中的最后一个值,它只会加入您的日历 table 以获取原始条目的确切 ig.date
值。
例如,对于 ID = 111
,最后日期是 2019 年 1 月 27 日,因此该行的 "NextValue" 将是 NULL
。如果您直接从您的 CTE select,您应该会看到如下内容:
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
替换为 returns 您希望它填充到的日期的函数;即昨天)。
我有一个带有日期、ID 和值的 table。对于某些ID,我没有到昨天为止的值。我需要重复每个 ID 的最后一个已知值,直到昨天它为 NULL。 我已经使用 CTE 来填充 2 个非 NULL 值之间的 NULL 值,但它直到昨天才起作用。 数据如下所示:
+-----------+-----+-------+
| 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")
;
这是预期的结果:
+-----------+-----+-------+
| Date | ID | Value |
+-----------+-----+-------+
| 1/25/2019 | 111 | 50 |
| 1/26/2019 | 111 | 100 |
| 1/27/2019 | 111 | 150 |
| 1/28/2019 | 111 | 150 |
| 1/29/2019 | 111 | 150 |
| 1/30/2019 | 111 | 150 |
| 1/31/2019 | 111 | 150 |
| 1/25/2019 | 222 | 500 |
| 1/26/2019 | 222 | 1000 |
| 1/27/2019 | 222 | 1500 |
| 1/28/2019 | 222 | 1500 |
| 1/29/2019 | 222 | 1500 |
| 1/30/2019 | 222 | 1500 |
| 1/31/2019 | 222 | 1500 |
+-----------+-----+-------+
感谢您的帮助。
在提供的查询中,如果某个日期是 id
的最后可用日期,则您的 lead
("NextValue") 返回的下一个日期将是 NULL
.要一直填写到昨天 "NextValue" 为 NULL
时,您需要更改 ISNULL
以将 NULL
替换为昨天的日期。
你目前的方式,当 "NextValue" 为 null 时,它 returns 原始日期,这意味着对于任何 id
系列中的最后一个值,它只会加入您的日历 table 以获取原始条目的确切 ig.date
值。
例如,对于 ID = 111
,最后日期是 2019 年 1 月 27 日,因此该行的 "NextValue" 将是 NULL
。如果您直接从您的 CTE select,您应该会看到如下内容:
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
替换为 returns 您希望它填充到的日期的函数;即昨天)。