フィールド内の指定された値から開始し、共有値に基づいて別の行の別のフィールドでその値を見つけて、材料の移動、それを移動するために使用される機器、およびタイミングのテーブルを逆方向にトレースできるようにしたい.
次の表では、たとえば、EndCode 'M' から関連するすべての行を StartCode A までさかのぼって追跡できるようにする必要があります。 'U' は StartCode 'N' に戻ります。
表では、StartCode (材料) A と B が移動して EndCode C になります。EndCode C は次に StartCodeD になり、次に StartCode E で移動して EndCode F になります。オレンジ/青の行は、材料の動きのグループを表します。
これから、「EndedAt」という名前の新しいフィールドとして、次のイベントの StartedAt 時刻をもたらす新しいテーブル/ビューを作成したいと考えています。次のようになります。
ROW_NUMBER と CTE を使用して、StartedAt を新しいフィールドとして "EndedAt" として取得する再帰クエリを作成しました。
次に、ネストされた SELECT ステートメントを使用して、EndCode 'M' に関連するすべての StartCode を検索し、テーブルをループバックして、StartCode 列で関連するすべての EndCode を検索しようとしました。これにより、いくつかの行のみが表示されます。ネストされたステートメントを数回繰り返して、さまざまな行に移動しました。
目的のテーブル/ビューを作成するために必要なすべての関連する開始/終了コードを取得するのに助けが必要です.
最終的にレポートがテーブルに添付され、選択した EndCode パラメータ (M、U など) でテーブルをフィルタリングできるようになります。
CREATE TABLE MyTable (
`StartCode` VARCHAR(1),
`StartedAt` DATETIME,
`EndCode` VARCHAR(1)
);
INSERT INTO MyTable (`StartCode`, `StartedAt`, `EndCode`)
VALUES
('A', '01/01/2019 01:00', 'C'),
('B', '01/01/2019 02:15', 'C'),
('C', '01/01/2019 03:00', 'F'),
('D', '01/01/2019 03:19', 'F'),
('E', '01/01/2019 04:00', 'F'),
('F', '01/01/2019 04:14', 'G'),
('G', '01/01/2019 05:00', 'J'),
('H', '01/01/2019 05:37', 'J'),
('I', '01/01/2019 05:45', 'J'),
('J', '01/01/2019 06:00', 'L'),
('K', '01/01/2019 06:09', 'L'),
('L', '01/01/2019 07:00', 'M'),
('N', '01/01/2019 09:20', 'P'),
('O', '01/01/2019 09:37', 'P'),
('P', '01/01/2019 09:45', 'Q'),
('Q', '01/01/2019 11:00', 'T'),
('R', '01/01/2019 11:10', 'T'),
('S', '01/01/2019 11:47', 'T'),
('T', '01/01/2019 11:58', 'U');