それで、ここにさらに別の「Xへのクエリを書く」チャレンジがあります。
私は多くのネットワーク化された自動販売機を監視しています。各マシンには、紙幣アクセプター、コインシステム、プリンターなど、いくつかの部品があります。
機械部品の問題はテーブルに記録されます。これを「障害」と呼びましょう。これは次のようになります(無関係なフィールドは省略されています)。
machineid partid start_time end_time
--------- ------ ---------------- ----------------
1 2 2009-10-05 09:00 NULL
1 3 2009-10-05 08:00 2009-10-05 10:00
2 2 2009-09-30 12:00 2009-09-30 14:00
3 4 2009-09-28 13:00 2009-09-28 15:00
3 2 2009-09-28 12:00 2009-09-28 14:00
問題が現在進行中の場合、end_dateはNULLです。
マシン全体がダウンしている期間を表示し、重複する範囲を説明して、それらを1つのレコードにまとめることができるクエリが必要です。したがって、上記のサンプルデータの場合、次のようになります。
machineid start_time end_time
--------- ---------------- ----------------
1 2009-10-05 08:00 NULL
2 2009-09-30 12:00 2009-09-30 14:00
3 2009-09-28 12:00 2009-09-28 15:00
これを1行ずつ実行する手続き型コードを作成するのは難しいことではありませんが、優れた宣言型SQLクエリの方が便利で、よりエレガントです。それは可能であるはずのようですが、私はそこにたどり着くことができません。
SQL方言はOracleです。それが助けになるなら、分析関数が利用可能です。
ありがとう!