6

しばらくの間苦労してきた次のクエリを生成するのを手伝ってください。月番号と、この特定の月に失敗したイベントがあったかどうかの情報を含む単純なテーブルがあるとします。

サンプルデータを生成するスクリプトの下:

WITH DATA(Month, Success) AS
(
    SELECT  1, 0 UNION ALL
    SELECT  2, 0 UNION ALL
    SELECT  3, 0 UNION ALL
    SELECT  4, 1 UNION ALL
    SELECT  5, 1 UNION ALL
    SELECT  6, 0 UNION ALL
    SELECT  7, 0 UNION ALL
    SELECT  8, 1 UNION ALL
    SELECT  9, 0 UNION ALL
    SELECT 10, 1 UNION ALL
    SELECT 11, 0 UNION ALL
    SELECT 12, 1 UNION ALL
    SELECT 13, 0 UNION ALL
    SELECT 14, 1 UNION ALL
    SELECT 15, 0 UNION ALL
    SELECT 16, 1 UNION ALL
    SELECT 17, 0 UNION ALL
    SELECT 18, 0
)

「繰り返される失敗」の定義を考えると:

任意の 6 か月間で少なくとも 4 か月間にイベント障害が発生した場合、そのような障害が発生した最後の月は「繰り返しの障害」であり、クエリは次の出力を返す必要があります。

Month   Success RepeatedFailure
1       0   
2       0   
3       0   
4       1   
5       1   
6       0       R1
7       0       R2
8       1   
9       0   
10      1   
11      0       R3
12      1   
13      0   
14      1   
15      0   
16      1   
17      0
18      0       R1

どこ:

  • R1 - 6 か月目に 1 回目の繰り返し故障 (過去 6 か月で 4 回の故障)。
  • R2 - 7 番目の月に 2 回目の故障が繰り返されました (過去 6 か月で 4 回の故障)。
  • R3 - 11 番目の月に 3 回目の故障が発生しました (過去 6 か月で 4 回の故障)。

R1 - 再び 18 番目の月に 1 回目の繰り返し失敗

繰り返される失敗は、その数に基づいて適切な乗数を適用する必要があるため、連続して数えられます。

  • 1 回目の失敗 - X2
  • 2 回目の失敗 - X4
  • 3 回目以降の繰り返しの失敗 -X5。
4

2 に答える 2

2
;WITH DATA(Month, Success) AS
(
    SELECT  1, 0 UNION ALL
    SELECT  2, 0 UNION ALL
    SELECT  3, 0 UNION ALL
    SELECT  4, 1 UNION ALL
    SELECT  5, 1 UNION ALL
    SELECT  6, 0 UNION ALL
    SELECT  7, 0 UNION ALL
    SELECT  8, 1 UNION ALL
    SELECT  9, 0 UNION ALL
    SELECT 10, 1 UNION ALL
    SELECT 11, 0 UNION ALL
    SELECT 12, 1 UNION ALL
    SELECT 13, 0 UNION ALL
    SELECT 14, 1 UNION ALL
    SELECT 15, 0 UNION ALL
    SELECT 16, 1 UNION ALL
    SELECT 17, 0 UNION ALL
    SELECT 18, 0
)

SELECT DATA.Month,DATA.Success,Isnull(convert(Varchar(10),b.result),'') +         
Isnull(CONVERT(varchar(10),b.num),'') RepeatedFailure
FROM (
SELECT *, ROW_NUMBER() over (order by Month) num FROM 
( Select * ,(case  when (select sum(Success) 
from DATA where MONTH>(o.MONTH-6) and MONTH<=(o.MONTH)  ) <= 2 
and o.MONTH>=6 then 'R' else  '' end) result
from DATA o
) a where result='R'
) b 
right join DATA on DATA.Month = b.Month
order by DATA.Month
于 2012-06-25T12:17:43.567 に答える
2

これは改善できると確信していますが、うまくいきます。基本的に 2 つのパスを実行します。1 つ目は繰り返される失敗を確立するためのもので、2 つ目はそれぞれがどのような種類の失敗を繰り返すかを確立するものです。Intermediate2間違いなくなくすことができることに注意してください。明確にするために分離しただけです。すべてのコードは 1 つのステートメントであり、私の説明はインターリーブされています。

;WITH DATA(Month, Success) AS
-- assuming your data  as defined (with my edit)
,Intermediate AS 
(
SELECT
    Month,
    Success,
    -- next column for illustration only
    (SELECT SUM(Success) 
     FROM DATA hist 
     WHERE curr.Month - hist.Month BETWEEN 0 AND 5) 
        AS SuccessesInLastSixMonths,
    -- next column for illustration only
    6 - (SELECT SUM(Success) 
     FROM DATA hist 
     WHERE curr.Month - hist.Month BETWEEN 0 AND 5) 
        AS FailuresInLastSixMonths,
    CASE WHEN 
            (6 - (SELECT SUM(Success) 
                    FROM DATA hist 
                    WHERE curr.Month - hist.Month BETWEEN 0 AND 5)) 
            >= 4 
            THEN 1
            ELSE 0 
    END AS IsRepeatedFailure
FROM DATA curr 
-- No real data until month 6
WHERE curr.Month > 5
)

この時点で、その月までの 6 か月間の失敗を数えることによって、それが繰り返しの失敗であるかどうかを月ごとに確立しました。

,Intermediate2 AS
(
SELECT 
    Month,
    Success,
    IsRepeatedFailure,
    (SELECT SUM(IsRepeatedFailure) 
        FROM Intermediate hist 
        WHERE curr.Month - hist.Month BETWEEN 0 AND 5) 
        AS RepeatedFailuresInLastSixMonths
FROM Intermediate curr
)

今までの半年間の失敗回数を数えてみました

SELECT
    Month,
    Success,
    CASE IsRepeatedFailure 
        WHEN 1 THEN 'R' + CONVERT(varchar, RepeatedFailuresInLastSixMonths) 
        ELSE '' END
    AS RepeatedFailureText
FROM Intermediate2

したがって、今月が繰り返し失敗した場合、繰り返し失敗のカーディナリティはどれくらいかがわかります。

結果:

Month       Success     RepeatedFailureText
----------- ----------- -------------------------------
6           0           R1
7           0           R2
8           1           
9           0           
10          1           
11          0           R3
12          1           
13          0           
14          1           
15          0           
16          1           
17          0           
18          0           R1

(13 row(s) affected)

パフォーマンスに関する考慮事項は、実際に持っているデータの量によって異なります。

于 2012-06-25T11:27:32.350 に答える