这是我的数据
(感谢乔纳斯)小提琴链接:http://sqlfiddle.com/#!18 /7ff39/1
订阅阶段 | 订阅ID | 日期 | 上一个日期 |
---|---|---|---|
利用率 | 1 | 2022 年 2 月 23 日 | 无效的 |
无效的 | 1 | 2022 年 2 月 24 日 | 2022 年 2 月 23 日 |
无效的 | 1 | 2022 年 2 月 25 日 | 2022 年 2 月 23 日 |
无效的 | 1 | 2022 年 2 月 26 日 | 2022 年 2 月 23 日 |
无效的 | 1 | 2022 年 2 月 27 日 | 2022 年 2 月 23 日 |
利用率 | 1 | 2022 年 2 月 28 日 | 无效的 |
无效的 | 1 | 2022 年 3 月 1 日 | 2022 年 2 月 28 日 |
无效的 | 1 | 2022 年 3 月 2 日 | 2022 年 2 月 28 日 |
无效的 | 1 | 2022 年 3 月 3 日 | 2022 年 2 月 28 日 |
无效的 | 1 | 2022 年 3 月 4 日 | 2022 年 2 月 28 日 |
无效的 | 1 | 2022 年 3 月 5 日 | 2022 年 2 月 28 日 |
利用率 | 1 | 2022 年 3 月 6 日 | 无效的 |
我需要返回的是 PreviousDate 列中的内容(除了 Date 列之外)。考虑到每个 SubscriptionId,我想找到 SubscriptionPhase 不为 NULL 的上一个条目并返回该日期,以便我将该日期用于其他用途。
您可以使用窗口函数来获取最大日期值:
CASE WHEN SubscriptionPhase IS NULL
- 这样,日期仅针对空行计算MAX(CASE WHEN subscriptionphase IS NOT NULL THEN cast(date AS date) END)
这采用按 ID 分组的阶段不为空的最大日期。ORDER BY cast(date AS date)
确保正确排序,同时rows BETWEEN unbounded preceding AND 1 preceding
确保您的“窗口”是前面的行。我希望我正确理解了您的要求。这就是我如何看到这个 sql 查询。
要在 SQL 中返回列表中空值之前的第一个日期,可以使用 SQL 函数和子查询的组合。假设您有一个包含日期列表和一些空值的表,下面是如何检索空值之前的第一个日期的示例:
假设您有一个名为 your_table 的表,其中包含 date_column 和 value_column 列。您想要查找 value_column 中空值之前的第一个日期。您可以使用如下查询:
以下是该查询的作用:
子查询
(SELECT MIN(date_column) FROM your_table WHERE value_column IS NULL)
查找 value_column 为 null 的行中的最小日期值。这表示具有空值的最早日期。(MAX(date_column))
然后,主查询在 value_column 为 null 的行中搜索最大日期值(WHERE value_column IS NULL)
,但也将日期限制为小于子查询中找到的最小日期。这可确保您获得空值之前的最大日期值。此查询的结果将是 value_column 中空值之前的第一个日期。