如何通过比较一行与下一行来填充新列
How to populate new column by comparing one row with its next row
我发现很难编写查询来获得所需的输出。
我需要获取两个连续行之间的日期差异,如果日期差异 <=6 个月且原因代码有效“是”,则新列应填充值“是”,否则为“否”
我必须根据下面给出的标准用值“是”或“否”填充新列
标准 1:
对于第一行,新列值应始终为“否”
从第二行开始,如果两个日期差异 <=6 个月并且原因代码有效,则新列值应为“是”,否则为“否”
第一行和第二行的日期差异 <=6 个月并且代码有效“是”因此新列值为是。
第二行和第三行的日期差异 <=6 个月但有效为“否”因此新列值为“否”。
第三行和第四行的日期差异超过 6 个月,但有效为“是”,因此新列值为“否”。
输出应如下所示
卡斯蒂德
enter_date
Rscode
有效
New_column
123
2020-04-11
BCB
是
没有
123
2020-06-13
ABC
是
是
123
2020-09-01
胎牛血清
没有
没有
123
2021-05-01
ABC
是
没有
123
2021-07-05
ABC
是
是
条件 2:
如果原因代码以“RQT”开头并且任何有效代码后跟 RQT(偶数日期差异为 6 个月且原因代码有效),则新列应从下一个连续行开始为“否”,输出与是。
卡斯蒂德
enter_date
Rscode
有效
New_column
345
2020-02-19
RQT
是
没有
345
2020-03-22
BCB
是
没有
345
2020-06-18
RQT
是
是
345
2020-10-29
BCB
是
是
345
2021-03-24
ABC
是
是
卡斯蒂德
enter_date
Rscode
有效
New_column
346
2020-02-19
RQT
是
没有
346
2020-03-22
RQT
是
没有
346
2020-06-18
RQT
是
是
346
2020-10-29
BCB
是
是
346
2021-03-24
RQT
是
是
您需要一些 Window 函数和 CASE,如下所示:
case
-- If reason code is starts with "RQT"
when first_value(Rscode) over (partition by custid order by enter_date) = 'RQT'
-- and any of the valid code is followed By RQT
and lead(Rscode) over (partition by custid order by enter_date) = 'RQT' then 'No'
-- If two dates difference is <=6 moths and reason code is valid then new column value should be "Yes" other wise "No"
when enter_date <= add_months(lag(enter_date) over (partition by custid order by enter_date), 6)
and valid = 'Yes'
then 'Yes'
else 'No' -- also covers: For first row, New column value should be always "No"
end
我发现很难编写查询来获得所需的输出。 我需要获取两个连续行之间的日期差异,如果日期差异 <=6 个月且原因代码有效“是”,则新列应填充值“是”,否则为“否”
我必须根据下面给出的标准用值“是”或“否”填充新列
标准 1:
对于第一行,新列值应始终为“否”
从第二行开始,如果两个日期差异 <=6 个月并且原因代码有效,则新列值应为“是”,否则为“否”
第一行和第二行的日期差异 <=6 个月并且代码有效“是”因此新列值为是。
第二行和第三行的日期差异 <=6 个月但有效为“否”因此新列值为“否”。
第三行和第四行的日期差异超过 6 个月,但有效为“是”,因此新列值为“否”。
输出应如下所示
卡斯蒂德 | enter_date | Rscode | 有效 | New_column |
---|---|---|---|---|
123 | 2020-04-11 | BCB | 是 | 没有 |
123 | 2020-06-13 | ABC | 是 | 是 |
123 | 2020-09-01 | 胎牛血清 | 没有 | 没有 |
123 | 2021-05-01 | ABC | 是 | 没有 |
123 | 2021-07-05 | ABC | 是 | 是 |
条件 2:
如果原因代码以“RQT”开头并且任何有效代码后跟 RQT(偶数日期差异为 6 个月且原因代码有效),则新列应从下一个连续行开始为“否”,输出与是。
卡斯蒂德 | enter_date | Rscode | 有效 | New_column |
---|---|---|---|---|
345 | 2020-02-19 | RQT | 是 | 没有 |
345 | 2020-03-22 | BCB | 是 | 没有 |
345 | 2020-06-18 | RQT | 是 | 是 |
345 | 2020-10-29 | BCB | 是 | 是 |
345 | 2021-03-24 | ABC | 是 | 是 |
卡斯蒂德 | enter_date | Rscode | 有效 | New_column |
---|---|---|---|---|
346 | 2020-02-19 | RQT | 是 | 没有 |
346 | 2020-03-22 | RQT | 是 | 没有 |
346 | 2020-06-18 | RQT | 是 | 是 |
346 | 2020-10-29 | BCB | 是 | 是 |
346 | 2021-03-24 | RQT | 是 | 是 |
您需要一些 Window 函数和 CASE,如下所示:
case
-- If reason code is starts with "RQT"
when first_value(Rscode) over (partition by custid order by enter_date) = 'RQT'
-- and any of the valid code is followed By RQT
and lead(Rscode) over (partition by custid order by enter_date) = 'RQT' then 'No'
-- If two dates difference is <=6 moths and reason code is valid then new column value should be "Yes" other wise "No"
when enter_date <= add_months(lag(enter_date) over (partition by custid order by enter_date), 6)
and valid = 'Yes'
then 'Yes'
else 'No' -- also covers: For first row, New column value should be always "No"
end