2017-01-23 17 views
1

あらかじめ助けていただきありがとうございます。私はMS SQL Server 2008で作業していて、少なくとも4つの "0"が行内にあるAuto_Manualカラムの値が "0"の最初のローからデータをキャプチャしようとしています。列が同じ値を4回連続して持つ場合、値の最初の行を返します

Lot  DateTimeStamp Auto_Manual rn 
---------------------------------------- 
abc123 1/4/2017 2:08  1  1 
abc123 1/4/2017 2:10  1  2 
abc123 1/4/2017 2:12  1  3 
abc123 1/4/2017 2:14  1  4 
abc123 1/4/2017 2:16  1  5 
abc123 1/4/2017 2:18  1  6 
abc123 1/4/2017 2:20  1  7 
abc123 1/4/2017 2:22  1  8 
abc123 1/4/2017 2:24  0  1 
abc123 1/4/2017 2:26  1  9 
abc123 1/4/2017 2:28  1  10 
abc123 1/4/2017 2:30  1  11 
abc123 1/4/2017 2:32  0  2 
abc123 1/4/2017 2:34  1  12 
abc123 1/4/2017 2:36  1  13 
abc123 1/4/2017 2:38  0  3 
abc123 1/4/2017 2:40  0  4 
abc123 1/4/2017 2:42  0  5 
abc123 1/4/2017 2:44  0  6 
abc123 1/4/2017 2:46  0  7 

私が探している結果は次のとおりです:

Lot  DateTimeStamp Auto_Manual rn 
---------------------------------------- 
abc123 1/4/2017 2:38  0  3 

これまでのところ、私が行うことができましたすべてがで仕切られた行番号を取得しているここに私のデータのサンプルがありますロットおよびAuto_Manual列:

select 
    Lot 
    ,DateTimeStamp 
    ,Auto_Manual 
    ,ROW_NUMBER() over (partition by Lot, Auto_Manual 
    order by DateTimeStamp) rn 

    from dbo.Table) tmp 

    order by Lot, DateTimeStamp 

私はAuto_Manual = 0または1のいずれかのためにRN = 1行を選択することができるよ、それは私がやって探しているまさにではありません。私は、Auto_Manual列に4つの連続する "0"がある最初の行だけを必要とします。代わりに、最初のAuto_Manualの値が "0"であることが分かります.8分後に値が "0"のままであることに注意してください。間に「0」しかない場合にのみ有効です。

ご協力いただければ幸いです。

おかげ

答えて

1

これは少し醜いですが、それが動作するはずです:

select * from (
    select 
     *, last_value(RN) over (partition by GRP order by DateTimeStamp RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as LASTVAL, 
     row_number() over (partition by GRP order by DateTimeStamp) as RN2 
    from (
    select *, RN - row_number() over (order by DateTimeStamp asc) GRP 
     from (
      select 
       *, row_number() over (order by DateTimeStamp asc) as RN 
      from Table1 
     ) X where Auto_Manual = 0 
    ) Y 
) Z where LASTVAL >= RN+3 and RN2 = 1 
order by DateTimeStamp 

まずこの数字すべての行は、その後、ちょうどそれらの行が再び番号が付けられている0を有するものとフィルタそれらをグループ化するために数字の違いが使用されます。差異が同じであれば、それらは連続したグループに属します。

このグループはlast_valueで処理され、最後の値が現在の行+ 3以上であれば、少なくとも4つの行があり、そのグループの最初の行を選択するための行番号がもう1つあります。

2008あなたはこのような何かを行うことができます:

select min(DateTimeStamp) 
from (
    select *, RN - row_number() over (order by DateTimeStamp asc) GRP 
    from (
     select 
      *, row_number() over (order by DateTimeStamp asc) as RN 
     from Table1 
    ) X where Auto_Manual = 0 
) Y 
group by GRP 
having count(*) >= 4 
+0

ジェームズを、助けのためにあなたをとても感謝しています。 SQL Server 2008を使用していることを指定しておく必要があります.Loos_valueは2012年に付属の関数です。OPにその情報を含めないと申し訳ありません。潜在的な回避策はありますか? – Djones12

+0

ああ、私はタグを見ただけです...もちろん、最後の値を内側のセレクトに置き換えることはできますが、それはパフォーマンスにとってはあまり効果がありません。 1つのオプションは、日付のためのグループを使用し、分を取ってそれに基づいて残りのデータを見つけることができます –

+0

2008年に提供した2番目のソリューションは、3つの値を返します:1/4/2017 2:24 || 1/4/2017 2:32 || 1/4/2017 2:38だからそれは正しくグループ化し、各グループのmin rnを選択しているように見えます。しかし残念なことに、それはすべてのグループの分を選択しています。これがなぜなのか? – Djones12

関連する問題