3列 (id(int),date(date),Status(bool)) のテーブルがあります。
このような
id date Status
1 2012-10-18 1
1 2012-10-19 1
1 2012-10-20 0
1 2012-10-21 0
1 2012-10-22 0
1 2012-10-23 0
1 2012-10-24 1
1 2012-10-25 0
1 2012-10-26 0
1 2012-10-27 0
1 2012-10-28 1
2 2012-10-19 0
2 2012-10-20 0
2 2012-10-21 0
2 2012-10-22 1
2 2012-10-23 1
日付列は連続しており、日付間にギャップはないと仮定します。
連続する 3 つのゼロ ([ステータス] 列) とその翌日のステータスを確認するにはどうすればよいですか?
このような
id startDate endDate NextDayStatus
1 2012-10-20 2012-10-22 0
1 2012-10-21 2012-10-23 1
1 2012-10-25 2012-10-27 1
2 2012-10-19 2012-10-21 1
テーブル作成スクリプトとサンプルデータ
CREATE TABLE [Table1](
[ID] [smallint] NOT NULL,
[Date] [date] NOT NULL,
[Status] [bit] NULL,
CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED ( [ID] ASC, [Date] ASC ) )
INSERT INTO [Table1]([ID], [Date], [Status])
SELECT 1, '2012-10-18', 1 UNION ALL
SELECT 1, '2012-10-19', 1 UNION ALL
SELECT 1, '2012-10-20', 0 UNION ALL
SELECT 1, '2012-10-21', 0 UNION ALL
SELECT 1, '2012-10-22', 0 UNION ALL
SELECT 1, '2012-10-23', 0 UNION ALL
SELECT 1, '2012-10-24', 1 UNION ALL
SELECT 1, '2012-10-25', 0 UNION ALL
SELECT 1, '2012-10-26', 0 UNION ALL
SELECT 1, '2012-10-27', 0 UNION ALL
SELECT 1, '2012-10-28', 1 UNION ALL
SELECT 2, '2012-10-19', 0 UNION ALL
SELECT 2, '2012-10-20', 0 UNION ALL
SELECT 2, '2012-10-21', 0 UNION ALL
SELECT 2, '2012-10-22', 1 UNION ALL
SELECT 2, '2012-10-23', 1
アップデート:
- 重要な場合は、この手順の後、月の最初、10 日、または 20 日を除外するだけで済みます。
- Tomalak と gnb に感謝します。私の実際のタスクでは、連続するゼロの数は、このサンプルでは 3 ではなく9であるため、9 つの内部結合またはクロス適用を使用すると効率が悪いようです。