0

私はSQLでまったく新しいです。テーブルからのみ特定の行を返す必要があるクエリに取り組んでいました。(以下のソーステーブルの例と必要な出力を参照してください)。誰かがこれを理解するのを手伝ってもらえますか? 行の繰り返しに関する関連トピックを検索しようとしましたが、探していた答えが見つかりませんでした。ありがとう。

サンプルテーブル

Machine   Station   Defect Code CreateTime
1         LU        f1          8/20/2013 7:07
1         LU        f2          8/20/2013 7:07
1         SLC       d1          8/20/2013 7:08
1         SLC       d2          8/20/2013 7:09
1         SLC       d3          8/20/2013 7:10
1         SLC       d1          8/20/2013 7:10
1         SLC       d2          8/20/2013 7:11
1         SLC       d1          8/20/2013 7:17
1         SLC       d1          8/20/2013 7:20
1         UL        f3          8/20/2013 7:26
1         UL        f4          8/20/2013 7:26
1         UL        f3          8/20/2013 7:26
1         UL        f4          8/20/2013 7:26
2         LU        f2          8/20/2013 7:29
2         SLC       d1          8/20/2013 7:31
2         SLC       d1          8/20/2013 7:38
2         SLC       d2          8/20/2013 7:38
2         SLC       d3          8/20/2013 7:39
2         SLC       d2          8/20/2013 7:39
2         SLC       d4          8/20/2013 7:39
2         SLC       d5          8/20/2013 7:42
2         SLC       d1          8/20/2013 7:43
2         SLC       d1          8/20/2013 7:52
2         SLC       d1          8/20/2013 7:53
2         SLC       d2          8/20/2013 7:53
2         SLC       d2          8/20/2013 7:54
2         SLC       d4          8/20/2013 7:55
2         SLC       d5          8/20/2013 7:56

必要な結果:

Machine1 で OCAP がトリガーされました。d1 複数出現

Machine Station Defect Code CreateTime
1       SLC     d1          8/20/2013 7:08
1       SLC     d1          8/20/2013 7:10
1       SLC     d1          8/20/2013 7:17
1       SLC     d1          8/20/2013 7:20

Machine1 で OCAP がトリガーされました。d1連続発生

Machine Station Defect Code CreateTime
1       SLC     d1          8/20/2013 7:17
1       SLC     d1          8/20/2013 7:20

マシン 2 でトリガーされた OCAP。d1 連続発生

Machine Station Defect Code CreateTime
2       SLC     d1          8/20/2013 7:31
2       SLC     d1          8/20/2013 7:38

マシン 2 でトリガーされる OCAP。d2 複数回発生

Machine Station Defect Code CreateTime
2       SLC     d2          8/20/2013 7:38
2       SLC     d2          8/20/2013 7:39
2       SLC     d2          8/20/2013 7:53
4

1 に答える 1

1

複数のオカレンスが最も簡単です。それぞれの組み合わせをいくつ見つけることができるかを数え、その数が 3 より大きいものを選択します。

SELECT S.Machine,
       S.Station,
       S.DefectCode,
       S.CreateTime
FROM ( SELECT Machine,
              Station,
              DefectCode,
              CreateTime,
              COUNT(CreateTime) OVER (PARTITION BY Machine, Station, DefectCode) AS DefectCount
       FROM SAMPLE
       WHERE Machine = :machine ) S
WHERE S.DefectCount > 3

連続して発生するのは少し難しいです (次のクエリは最適なものではない可能性があります)。連続が「連続した日付」であると仮定すると、次のことを試すことができます。

WITH OrderedSample
AS ( SELECT Machine,
            Station,
            DefectCode,
            CreateTime,
            ROW_NUMBER() OVER (ORDER BY CreateTime) AS RowNr
     FROM SAMPLE
     WHERE Machine = :machine )

SELECT Current.Machine,
       Current.Station,
       Current.DefectCode,
       Current.CreateTime
FROM OrderedSample Current
WHERE EXISTS ( SELECT 1
               FROM OrderedSample Next
               WHERE Current.Machine = Next.Machine
               AND   Current.Station = Next.Station
               AND   Current.DefectCode = Next.DefectCode
               AND   Current.RowNr = Next.RowNr - 1 )
OR    EXISTS ( SELECT 1
               FROM OrderedSample Prev
               WHERE Current.Machine = Prev.Machine
               AND   Current.Station = Prev.Station
               AND   Current.DefectCode = Prev.DefectCode
               AND   Current.RowNr = Prev.RowNr + 1 )

編集

固定されたマシンで作業しているため、2 番目のクエリが少し簡単になることに気付きました。

WITH OrderedSample
AS ( SELECT Machine,
            Station,
            DefectCode,
            CreateTime,
            ROW_NUMBER() OVER (ORDER BY CreateTime) AS RowNr
     FROM SAMPLE
     WHERE Machine = :machine )

SELECT Curr.Machine,
       Curr.Station,
       Curr.DefectCode,
       Curr.CreateTime, RowNr
FROM OrderedSample Curr
WHERE EXISTS ( SELECT 1
               FROM OrderedSample Next
               WHERE Curr.Station = Next.Station
               AND   Curr.DefectCode = Next.DefectCode
               AND   Curr.RowNr = Next.RowNr - 1 )
OR    EXISTS ( SELECT 1
               FROM OrderedSample Prev
               WHERE Curr.Station = Prev.Station
               AND   Curr.DefectCode = Prev.DefectCode
               AND   Curr.RowNr = Prev.RowNr + 1 )

編集 2 : マシンとステーションが 2 つの列であることに気付き、編集されました

EDIT 3 : Sql Fiddleの例に基づくいくつかの修正

于 2013-08-22T06:43:15.160 に答える