1

チームが作業していた連続したシフトと日数を表示しようとしています。私はいくつかのソリューションを試してきましたが、それほど正しくは解決できません。SQLで連続シフトと日数をカウントする

データは、Date、Shift、Crewです。昼と夜のシフトと3人の乗組員がいます。 ConsecutiveShiftとConsecutiveDayは私が作成しようとしているフィールドです。この出力は、連続したシフト/作業日数に基づいて生産性を調べるために使用されます。

すべてのヘルプは非常に

Dateop    Shift Crew 
2015-12-23 00:00:00 D  B Crew 
2015-12-23 00:00:00 N  A Crew 
2015-12-24 00:00:00 D  B Crew 
2015-12-24 00:00:00 N  A Crew 
2015-12-25 00:00:00 D  C Crew 
2015-12-25 00:00:00 N  B Crew 
2015-12-26 00:00:00 D  C Crew 
2015-12-26 00:00:00 N  B Crew 
2015-12-27 00:00:00 D  C Crew 
2015-12-27 00:00:00 N  B Crew 
2015-12-28 00:00:00 D  C Crew 
2015-12-28 00:00:00 N  B Crew 
2015-12-29 00:00:00 D  C Crew 
2015-12-29 00:00:00 N  B Crew 
2015-12-30 00:00:00 D  A Crew 
2015-12-30 00:00:00 N  C Crew 
2015-12-31 00:00:00 D  A Crew 
2015-12-31 00:00:00 N  C Crew 
2016-01-01 00:00:00 D  A Crew 
2016-01-01 00:00:00 N  C Crew 
2016-01-02 00:00:00 D  A Crew 
2016-01-02 00:00:00 N  C Crew 

所望の出力を高く評価している - 最初の3列は、元のデータであり、列4と5は、私が

+1

DBMS(Sql Server、Oracle、MySQLなど)とは何ですか? – wdosanjos

+0

私はあなたの必要な出力を理解していません。もっと説明できますか?なぜ5で連続リセット?それは厳しい制限か、何らかの種類の平日の窓に基づいていますか?なぜ1,1thではなく、30th = 1,6? –

+0

入力データを画像ではなくテキストとして貼り付けることができますか?他の人があなたを助けやすくします。 – mendosi

答えて

0
を生成しようとしていますカウントされています

ウィンドウ関数を使用して、次のクエリが機能します。

With cte As (
    Select DateOp, Shift, Crew, 
     DateDiff(Day, DateOp, '2016-01-01') + Row_Number() Over (Partition By Crew, Shift Order By DateOp) As ShiftIsland, 
     DateDiff(Day, DateOp, '2016-01-01') + Row_Number() Over (Partition By Crew Order By DateOp) As DayIsland 
     From [YourTable])  
Select DateOp, Shift, Crew, 
    Row_Number() Over (Partition By Crew, Shift, ShiftIsland Order By DateOp) As ConsecutiveShifts, 
    Row_Number() Over (Partition By Crew, DayIsland Order By DateOp) As ConsecutiveDays 
    From cte 
    Order By Crew, DateOp, Shift; 
+0

Mendosi、あなたは男です!完璧に動作し、私はちょうど論理を正しく得ることができませんでした。 –

-1

これは基本的なrow_number()だと思います。あなたが提供したデータの場合:

select t.*, 
     row_number() over (partition by shift, crew order by date) as consecutiveshift, 
     row_number() over (partition by crew order by date) as consecutiveday 
from t; 

これは少なくともあなたの質問にあるデータを返します。

+0

この解決策は12月24日から30日の間に休憩を取っている乗組員Aでは機能しません。これは12月30日に 'ConsecutiveDay'を1にリセットする必要があります。 – mendosi

+0

@mendosi。 。 。答えに明示的に*記載されているように、これは質問に与えられた結果を返します。 OPは、「欠落」日がどうなるか、またはそれがデータ内で可能であっても、何が起こるかを明確にしていない。 –

+0

実際には、あなたの答えの前に投稿されたコメントにOPが指定されました。シフト・カウンターは、各乗組員が5日間働いてから5泊を過ぎた後にリセットされますが、その日は10日間続き**、休みの日にリセットされます**元の質問では、いくつかの場所で。 – mendosi

関連する問題