0
file_id   status  date_occure
1         1       2013-04-10:3:26
1         2       2013-04-10:3:27
1         3       2013-04-10:3:28 

同じ file_id で、3 つのステータスを持つ行のみ: 1、2、3 は同じ日付で、1 つずつ発生し、1 回の発生としてカウントする必要があります。

-----------------------------------
1         4       2013-04-10:3:26
rows whis another statuses not be counted
----------------------------------
1         1       2013-04-10:3:26
1         3       2013-04-10:3:27
1         2       2013-04-10:3:28       
also rows ordered by date but statuses no (1->2->3) not be counted
-----------------------------------

テーブルには多くの行が含まれています。結果は でグループ化する必要があります file_id

感謝と敬意

4

1 に答える 1

2

あなたの問題は、日ごとにグループ化したいという事実に起因すると思いますが、あなたの列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 の例

于 2013-04-10T09:08:31.940 に答える