在SQL Server中,我有这样的源数据.As_of_date|issue_id|issue_status_name|prev_issue_status_name在我的源表中,所需的输出就是我正在寻找的.

基本上需要将Issue_Status_Name与Prev_Issue_Status_Name进行比较,当Prev_Issue_Status_Name在(NULL、OPEN、DRAILT)中,而Issue_Status_NAME在(待定可持续性、待定验证、Closed)中时,我们应该设置AS_OF_DATE并在前面的行中填写,直到发生相反情况.

我try 这样做,首先编写Case语句来填充1,否则填充0,然后递增数字,但我不确定如何处理每次出现的情况.有谁能给我指个方向吗?

as_of_date issue_id issue_status_name prev_issue_status_name desired_output
12/31/2019 123456 Draft NULL NULL
1/1/2020 123456 Draft Draft NULL
1/2/2020 123456 Draft Draft NULL
1/3/2020 123456 Pending Validation Draft 1/3/2020
1/4/2020 123456 Pending Validation Pending Validation 1/3/2020
1/5/2020 123456 Pending Validation Pending Validation 1/3/2020
1/6/2020 123456 Pending Validation Pending Validation 1/3/2020
1/7/2020 123456 Open Pending Validation NULL
1/8/2020 123456 Open Open NULL
1/9/2020 123456 Open Open NULL
1/10/2020 123456 Open Open NULL
1/11/2020 123456 Pending Sustainability Open 1/11/2020
1/12/2020 123456 Pending Sustainability Pending Sustainability 1/11/2020
1/13/2020 123456 Pending Sustainability Pending Sustainability 1/11/2020
1/14/2020 123456 Pending Sustainability Pending Sustainability 1/11/2020
1/15/2020 123456 Pending Validation Pending Sustainability 1/11/2020
1/16/2020 123456 Pending Validation Pending Validation 1/11/2020
1/17/2020 123456 Pending Validation Pending Validation 1/11/2020
1/18/2020 123456 Pending Validation Pending Validation 1/11/2020
1/19/2020 123456 Pending Validation Pending Validation 1/11/2020
1/20/2020 123456 Pending Validation Pending Validation 1/11/2020
1/21/2020 123456 Open Pending Validation NULL
1/22/2020 123456 Open Open NULL
1/23/2020 123456 Open Open NULL
1/24/2020 123456 Open Open NULL
1/25/2020 123456 Open Open NULL
1/26/2020 123456 Open Open NULL
1/27/2020 123456 Closed Open 1/27/2020
1/28/2020 123456 Closed Closed 1/27/2020
1/29/2020 123456 Closed Closed 1/27/2020
1/30/2020 123456 Closed Closed 1/27/2020
1/31/2020 123456 Closed Closed 1/27/2020

我try 了以下几种方法:

当Issue_Status_Name in(待定验证、已关闭、待定可持续性)和Prev_Issue_Status_name in(NULL、OPEN、Draft)THEN SUM(情况当PRIV_ISESS_STATUS_NAME不在(待定验证、已关闭、待定可持续性)THEN_OF_DATE ELSE NULL

但它没有给出正确的输出.

推荐答案

实际上,您似乎并不关心以前的状态本身,而是应该将三个有趣的状态(挂起/关闭)的一系列连续状态视为一个单元,然后返回其中的前as_of_date个状态.这使用标准的行编号间隙和孤岛技术:

with data as (
    select *,
        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
    from T cross apply (values (
        case when issue_status_name
                  in ('Pending Validation', 'Pending Sustainability', 'Closed')
             then 1 else 0 end)) v(output_flag) /* not sure what's a good name */
)
select as_of_date, issue_id, issue_status_name, prev_issue_status_name,
    case when output_flag = 1
         then min(as_of_date) over (partition by issue_id, grp) end as desired_output
from data;

https://dbfiddle.uk/6i92BbzL?hide=2

Sql相关问答推荐

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

Lag()函数的差异:R与SQL(将R代码转换为SQL)

从日期开始向前填充重复项

收到%1、%2或%2邮箱的唯一客户

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

返回找到的最小和最大row_number()spark SQL

在SQL GROUP BY中的某些行之后执行计算

Oracle分层查询-两条路径在末尾合并为一条

我需要一个regexp_like来只验证字母D或T、数字和管道

从类似JSON的字符串列创建新列

比较SQL中以逗号分隔的字符串

输出连续出现两次以上的行

向表中添加新列取决于表的日期列(unpivot)

我需要在 ASP.NET C# 中获取 2 个 SQL 查询结果的平均值

替换SQL Server XML中多处出现的 node 值

Postgres,使用 select 插入多个值

如何根据 SQL Server 中 1 条语句中 SELECT 的结果进行 INSERT 或 UPDATE

根据行号将列转置为没有任何id或键列的行

PostgreSQL 如何在一组项目及其数量上找到完全相同的订单?

BigQuery - 将 TIMESTAMP 转换为 HH:MM:SS,然后识别 TIME_DIFF