2
ID  Date    flag_14  flag_21
1   1/1/2013    1     1
1   1/16/2013   1     0
1   1/19/2013   0     0
1   1/23/2013   0     1
1   1/26/2013   0     0
2   1/1/2013    1     1    
2   1/18/2013   1     0

嗨,我很抱歉这可能是一个愚蠢的问题,但我真的可以使用一些帮助。所以我想创建上面的输出。前 2 列是输入(id 和 date)。逻辑是使用 14 天和 21 天作为截止时间,通过比较当前记录的日期和最后保存的日期来决定记录是否保留在同一 id 内。始终保留每个 id 的第一条记录(标志为 1 表示“保留”,0 表示其他情况)。

例如,对于 id 1,如果截止日期为 21,则第二条记录的日期为 1/16/2013,即前一条记录的 15 天后(即第一条记录 1/1/2013),15<21 所以第二条记录的标志为 0。第三条记录相同,2013 年 1 月 19 日和 2013 年 1 月 1 日相隔 18 天,18<21 所以标志 =0。但是对于第 4 条记录,1/23/2013 和 1/1/2013 相隔 22 天,22>21,所以保留这条记录,flag=1。然后将第 5 条记录与上次保存的记录进行比较(现在是第 4 条记录),1/26/2013 和 1/23/2013 相隔 3 天,3<21,所以 flag =0。

是否有一个简单的使用类似的东西来迭代它partition by

谢谢!!

4

2 回答 2

1

请尝试一下,它按问题工作

with cte as
(
select o.*
from( 
    select  yourid,yourdate,ROW_NUMBER () Over (partition by yourid order by (select(0)) ) as RN
    from sedata 
    ) as o 
),
cte2 as
(
select r.*,
    case when  r.RN %2=0
    then
    (select DAY(r.YourDate) - DAY(r1.YourDate) where r.yourid = r1.yourid) 
    else
   (select DAY( r.YourDate) - DAY(min(YourDate)) from sedata where r.yourid = r1.yourid )
    end as Total   


 from cte r left  join cte r1 ON r.RN-1 = r1.RN  
 )
 select *
  ,case when   Total is null then 1 when Total >14 and Total <21 then 1   else 0  end as flag_14 ,
   case when  Total is null then 1 when Total > 21 then 1   else 0  end  as flag_21

  from cte2   where Total is not null or RN=1
于 2013-11-14T12:07:02.900 回答
0

如果我们谈论的是根据日期对数据进行排序,就像在您的示例中一样,我们可以使用类似于以下代码的内容(注意,我只使用 YourID 和 YourDate 字段):

CREATE TABLE SeData(
    YourID INT,
    YourDate DATE
)

INSERT INTO SeData
VALUES (1,'2013-01-01')
 , (1,'2013-01-16')
 , (1,'2013-01-19')
 , (1,'2013-01-23')
 , (1,'2013-01-26')

;WITH Roll AS(
    SELECT ROW_NUMBER() OVER (ORDER BY YourDate) ID
        , YourID
        , YourDate
    FROM SeData
)
SELECT *
    , (DAY(r1.YourDate) - DAY(r.YourDate)) AS NumberBetween -- just an example of comparing
FROM Roll r
    INNER JOIN Roll r1 ON r.ID = (r1.ID - 1)

从那里,您可以比较从 r 到 r1 的日期并更新/插入您需要的内容。

更新:我知道这适用于2012(虽然它有LAGand LEAD),2008R2但不确定它在 2005 年或更低版本上运行。

于 2013-11-13T21:09:00.107 回答