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 と日付) です。ロジックは、14 日と 21 日をカットオフとして使用して、現在のレコードと最後に保持された日付を比較することにより、レコードが同じ ID 内に保持されているかどうかを判断することです。各 ID の最初のレコードは常に保持されます (フラグは 1 で「保持」を示し、0 はそれ以外を示します)。

たとえば、ID 1 の場合、カットオフが 21 の場合、2 番目のレコードの日付は 2013 年 1 月 16 日です。これは、前に保持されたもの (最初のレコードは 2013 年 1 月 1 日) から 15 日後です。15<21 なので、 2 番目のレコードのフラグは 0 です。3 番目のレコードも同様で、2013 年 1 月 19 日と 2013 年 1 月 1 日は 18 日離れており、18<21 なのでフラグ = 0 です。しかし、4 番目のレコードでは、2013 年 1 月 23 日と 2013 年 1 月 1 日は 22 日離れており、22 > 21 であるため、このレコードはフラグ = 1 で保持されます。次に、5 番目のレコードが最後に保持されたレコード (現在は 4 番目のレコード) と比較されます。2013 年 1 月 26 日と 2013 年 1 月 23 日は 3 日離れており、3<21 なので、フラグ =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いますが (および がLAGありますLEAD)、2008R22005 以下で動作するかどうかはわかりません。

于 2013-11-13T21:09:00.107 に答える