我有这样的源数据:
场景一:
as_of_date | 问题_id | 问题状态名称 |
---|---|---|
2020年9月1日 | 123456 | 待验证 |
2020年9月2日 | 123456 | 待验证 |
2020年9月3日 | 123456 | 已关闭 |
2020年9月4日 | 123456 | 已关闭 |
2020年9月5日 | 123456 | 已关闭 |
2020年9月6日 | 123456 | |
2020年9月7日 | 123456 | 已关闭 |
2020年9月8日 | 123456 | 已关闭 |
2020年9月9日 | 123456 | 已关闭 |
2020年9月10日 | 123456 | 已关闭 |
此查询给出了正确的值:
基本上当状态处于待验证或已关闭时
(select
as_of_date,
issue_id,
issue_status_name,
row_number() over (partition by issue_id order by as_of_date) - row_number() over (partition by issue_id, output_flag order by as_of_date) as grp
,output_flag
from issues cross apply
(values (case when issue_status_name in ('Pending Validation', 'Closed')
then 1 else 0 end)) v(output_flag)
)
select
as_of_date,
issue_id,
issue_status_name,
case when output_flag = 1 then min(as_of_date) over (partition by issue_id, grp) end as desired_output
from cte
order by as_of_date```
场景2:
当之前的状态=待定的可持续性和当前状态(验证或关闭)时,我们得到记录 asofdt 并结转
当反向发生时(如所需的输出),我们设置 null
as_of_date | 问题_id | 问题状态名称 | 上一个状态名称 | 期望输出 |
---|---|---|---|---|
2020年9月1日 | 456789 | 待验证 | 空 | 空 |
2020年9月2日 | 456789 | 待验证 | 待验证 | 空 |
2020年9月3日 | 456789 | 已关闭 | 待验证 | 空 |
2020年9月4日 | 456789 | 已关闭 | 已关闭 | 空 |
2020年9月5日 | 456789 | 已关闭 | 已关闭 | 空 |
2020年9月6日 | 456789 | 可持续性待定 | 已关闭 | 空 |
2020年9月7日 | 456789 | 已关闭 | 可持续性待定 | 2020年9月7日 |
2020年9月8日 | 456789 | 已关闭 | 已关闭 | 2020年9月7日 |
2020年9月9日 | 456789 | 已关闭 | 已关闭 | 2020年9月7日 |
2020年9月10日 | 456789 | 已关闭 | 已关闭 | 2020年9月7日 |
我尝试了这个查询,但它给出了完全错误的输出: https://dbfiddle.uk/NskgiHL3
(select
as_of_date,
issue_id,
issue_status_name,
row_number() over (partition by issue_id order by as_of_date) - row_number() over (partition by issue_id, output_flag order by as_of_date) as grp
,output_flag
from issues cross apply
(values (case when issue_status_name in ('Pending Validation', 'Closed') and prev_status_name = 'Pending Sustainability'
then 1 else 0 end)) v(output_flag)
)
select
as_of_date,
issue_id,
issue_status_name,
case when output_flag = 1 then min(as_of_date) over (partition by issue_id, grp) end as desired_output
from cte
使用 LAG 和 MIN 这样的方法对您有用吗?:
WITH cte AS (
SELECT
as_of_date,
issue_id,
issue_status_name,
LAG(issue_status_name) OVER (PARTITION BY issue_id ORDER BY as_of_date) AS prev_status_name,
ROW_NUMBER() OVER (PARTITION BY issue_id ORDER BY as_of_date) -
ROW_NUMBER() OVER (PARTITION BY issue_id, output_flag ORDER BY as_of_date) AS grp,
output_flag
FROM issues
CROSS APPLY (VALUES (CASE WHEN issue_status_name IN ('Pending Validation', 'Closed') AND prev_status_name = 'Pending Sustainability' THEN 1 ELSE 0 END)) v(output_flag)
)
SELECT
as_of_date,
issue_id,
issue_status_name,
CASE WHEN output_flag = 1 THEN MIN(CASE WHEN prev_status_name = 'Pending Sustainability' THEN as_of_date END) OVER (PARTITION BY issue_id, grp) END AS desired_output
FROM cte
ORDER BY as_of_date;