间隙和孤岛问题 - SQL Server - 快照模型

问题描述 投票:0回答:1

我有这样的源数据:

场景一:

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 已关闭

此查询给出了正确的值:

基本上当状态处于待验证或已关闭时

https://dbfiddle.uk/YRJPI8DW

(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
sql gaps-and-islands
1个回答
0
投票

使用 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;
© www.soinside.com 2019 - 2024. All rights reserved.