SQL-根据前一行添加标志

时间:2018-12-05 09:20:27

标签: sql sql-server-2012

您好,希望有人可以提供帮助。我有一张看起来像下面的桌子。

 Case_ID        Task_ID        Created_Date       Created_By
  4567           5654          01-Jun-2018         John.Doe
  4567           2324          02-Jun-2018         John.Doe
  4567           8634          05-Jun-2018         Jane.Doe
  4567           2444          20-Jun-2018         Sharon.Test
  4567           8953          25-Jun-2018         Max.Test
  4567           2444          27-Jun-2018         John.Doe
  4567           8953          30-Jun-2018         Pamela.Test
  4567           6546          01-Aug-2018         John.Doe
  4567           7566          02-Aug-2018         Steven.Ely
  4567           7666          07-Aug-2018         Jane.Doe
  4567           9087          07-Aug-2018         Sharon.Test
  4567           5433          13-Aug-2018         Max.Test
  4567           4321          13-Aug-2018         John.Doe
  4567           1242          30-Aug-2018         Pamela.Test

每个Case_ID是一个个案。每当用户在这种情况下工作时,都会添加新的Task_ID以及此Task_ID的Created_Date和创建它的人的用户名。我需要一个附加列,一个标志,用于显示在14天之内是否有4个或更多不同的顾问处理了案件。我从上面需要的输出看起来像下面的

Case_ID        Task_ID        Created_Date       Created_By        Flag
  4567           5654          01-Jun-2018         John.Doe         0
  4567           2324          02-Jun-2018         John.Doe         0
  4567           8634          05-Jun-2018         Jane.Doe         0
  4567           2444          20-Jun-2018         Sharon.Test      0
  4567           8953          25-Jun-2018         Max.Test         0
  4567           2444          27-Jun-2018         John.Doe         0
  4567           8953          30-Jun-2018         Pamela.Test      1
  4567           6546          01-Aug-2018         John.Doe         0
  4567           7566          02-Aug-2018         Steven.Ely       0
  4567           7666          07-Aug-2018         Jane.Doe         0
  4567           9087          07-Aug-2018         Sharon.Test      1
  4567           5433          13-Aug-2018         Max.Test         1
  4567           4321          13-Aug-2018         John.Doe         1
  4567           1242          30-Aug-2018         Pamela.Test      0

因此,为了解释上述内容,Pamela.Test是第一个获得该标志的人是因为她是14天内在Case_ID 4567上工作的第四个不同的人,第一个是Sharon.Test在20天-2018年6月。自Pamela.Test进行此操作以来已超过14天,此标志在John.Doe的8月1日重置为0。另外,Created_Date列是日期时间,因此某些日子可能有多个与之关联的Task_ID

这有意义吗?我真的不知道从哪里开始,我将不胜感激,因为我将继续进行类似这样的项目,因此会有所帮助:)谢谢,杰西。

编辑-

查询的示例输出给出了以下解决方案的错误输出。不知道为什么Gareth.Opal是第一个也是唯一一个将Task_ID添加到1002982的人时带有标志的人

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:3)

类似这样的东西:-

CREATE TABLE #caseTable (
    Case_ID VARCHAR(10)
    ,Task_ID VARCHAR(10)
    ,Created_Date DATETIME
    ,Created_By VARCHAR(50)
    )

INSERT INTO #caseTable
VALUES (
    4567
    ,5654
    ,'01-Jun-2018'
    ,'John.Doe'
    )
    ,(
    4567
    ,2324
    ,'02-Jun-2018'
    ,'John.Doe'
    )
    ,(
    4567
    ,8634
    ,'05-Jun-2018'
    ,'Jane.Doe'
    )
    ,(
    4567
    ,2444
    ,'20-Jun-2018'
    ,'Sharon.Test'
    )
    ,(
    4567
    ,8953
    ,'25-Jun-2018'
    ,'Max.Test'
    )
    ,(
    4567
    ,2444
    ,'27-Jun-2018'
    ,'John.Doe'
    )
    ,(
    4567
    ,8953
    ,'30-Jun-2018'
    ,'Pamela.Test'
    )
    ,(
    4567
    ,6546
    ,'01-Aug-2018'
    ,'John.Doe'
    )
    ,(
    4567
    ,7566
    ,'02-Aug-2018'
    ,'Steven.Ely'
    )
    ,(
    4567
    ,7666
    ,'07-Aug-2018'
    ,'Jane.Doe'
    )
    ,(
    4567
    ,9087
    ,'07-Aug-2018'
    ,'Sharon.Test'
    )
    ,(
    4567
    ,5433
    ,'13-Aug-2018'
    ,'Max.Test'
    )
    ,(
    4567
    ,4321
    ,'13-Aug-2018'
    ,'John.Doe'
    )
    ,(
    4567
    ,1242
    ,'30-Aug-2018'
    ,'Pamela.Test'
    )
    ,(
    4568
    ,1005
    ,'30-Aug-2018'
    ,'D.Test'
    )
    ,(
    4568
    ,1002
    ,'30-Aug-2018'
    ,'C.Test'
    )
    ,(
    4568
    ,1000
    ,'30-Aug-2018'
    ,'B.Test'
    )
    ,(
    4568
    ,1001
    ,'30-Aug-2018'
    ,'A.Test'
    )

SELECT m.case_id
    ,m.task_id
    ,m.created_date
    ,m.created_by
    ,
    (select count(distinct s.Created_By) from 
    (select *,ROW_NUMBER() over( order by case_id, created_date) as rowNum from #caseTable)
    s
    where s.Created_Date between dateadd(D,-14,m.Created_Date) and m.Created_Date and s.rowNum<=m.rowNum
     and s.Case_ID=m.Case_ID) as uniqueCount,
    IIF((
            SELECT count(DISTINCT s.Created_By)
            FROM (
                SELECT *
                    ,ROW_NUMBER() OVER (
                        ORDER BY case_id
                            ,created_date
                        ) AS rowNum
                FROM #caseTable
                ) s
            WHERE s.Created_Date BETWEEN dateadd(D, - 14, m.Created_Date)
                    AND m.Created_Date
                AND s.rowNum <= m.rowNum  and s.Case_ID=m.Case_ID
            ) >= 4, 1, 0) AS flag
FROM (
    SELECT *
        ,ROW_NUMBER() OVER (
            ORDER BY case_id
                ,created_date
            ) AS rowNum
    FROM #caseTable
    ) m

DROP TABLE #caseTable

答案 1 :(得分:0)

我将使用相关的子查询:

select t.*,
       (case when (select count(distinct t2.created_by)
                   from t t2
                   where t2.case_id = t.case_id and
                         t2.created_date <= t.created_date and
                         t2.created_date > dateadd(day, -14, t.created_date)
                  ) >= 4
             then 1 else 0
         end) as four_consultant_flag
from t;