あなたの問題は、日ごとにグループ化したいという事実に起因すると思いますが、あなたの列Date_occure
には時間も保存されています。必要な正確な出力について 100% 確信があるわけではありませんが、これで必要なものがすべて得られるはずです。
WITH CTE AS
( SELECT [File_ID],
[Status],
Date_Occure,
Occurrences = COUNT(CASE WHEN [Status] IN (1, 2, 3) THEN [Status] END) OVER(PARTITION BY [File_ID], CAST(Date_Occure AS DATE)),
RowNumber = ROW_NUMBER() OVER(PARTITION BY [File_ID], CAST(Date_Occure AS DATE) ORDER BY Date_Occure, [Status] DESC)
FROM T
)
SELECT [File_ID], [Status], Date_Occure, Occurrences
FROM CTE
WHERE RowNumber = 1;
鍵はCAST(Date_Occure AS DATE)
、単にdate_occure
.
簡略化されたバージョンは次のようになります。
SELECT [File_ID],
Date_Occure = MIN(Date_Occure),
Occurrences = COUNT(CASE WHEN [Status] IN (1, 2, 3) THEN [Status] END)
FROM T
GROUP BY [File_ID], CAST(Date_Occure AS DATE);
編集
質問を読み直したところ、基準を理解したと思います。
3 つすべてのステータス (1、2、3) を順番に表示する必要がある場合は、次のように使用できます。
SELECT [File_ID],
Date_Occure = MIN(Date_Occure)
FROM T
WHERE NOT EXISTS
( SELECT 1
FROM T T2
WHERE T2.[File_ID] = t.[File_ID]
AND CAST(T2.Date_Occure AS DATE) = CAST(T.Date_Occure AS DATE)
AND T2.[Status] > T.[Status]
AND T2.Date_Occure < T.Date_Occure
)
GROUP BY [File_ID]
HAVING COUNT(DISTINCT CASE WHEN [Status] IN (1, 2, 3) THEN [Status] END) = 3;
はNOT EXISTS
、順不同ステータスのレコードが存在しないHAVING
ことを確認し、3 つのステータス(1、2、3)すべてが存在することを確認します。
特定の日のすべてのステータスが連続しているすべてのファイルが必要な場合は、次のようなものを使用してレコードをステータス順にランク付けし、それらを日付順にランク付けして、不一致があるファイルを除外できます。
WITH CTE AS
( SELECT [File_ID],
[Status],
Date_Occure,
DateOrder = ROW_NUMBER() OVER(PARTITION BY [File_ID], CAST(Date_Occure AS DATE) ORDER BY [Status], Date_Occure ASC),
StatusOrder = ROW_NUMBER() OVER(PARTITION BY [File_ID], CAST(Date_Occure AS DATE) ORDER BY Date_Occure, [Status] ASC),
Occurrences = COUNT(*) OVER(PARTITION BY [File_ID], CAST(Date_Occure AS DATE)),
RowNumber = ROW_NUMBER() OVER(PARTITION BY [File_ID], CAST(Date_Occure AS DATE) ORDER BY Date_Occure, [Status] DESC)
FROM T
)
SELECT [File_ID], [Status], Date_Occure, Occurrences
FROM CTE
WHERE RowNumber = 1
AND NOT EXISTS
( SELECT 1
FROM CTE T2
WHERE T2.[File_ID] = CTE.[File_ID]
AND CAST(T2.Date_Occure AS DATE) = CAST(CTE.Date_Occure AS DATE)
AND T2.DateOrder != T2.StatusOrder
);
SQL Fiddle の例