1

event属性start、、、endを持つテーブルがありますstatus。次のエントリが存在する可能性があります。

09:00:00 27.09.201210:00:0027.09.2012アクティブ
10:00:00 27.09.201211:00:0027.09.2012アクティブ
11:00:00 27.09.201212:00:0027.09.2012アクティブ
12:00:00 27.09.201213:00:0027.09.2012寝ている
13:00:00 27.09.201214:00:0027.09.2012寝ている
14:00:00 27.09.201215:00:0027.09.2012アクティブ

ここで、ステータスが変化しなかった間隔を抽出したいと思います。この例の結果は次のようになります。

09:00:00 27.09.201212:00:0027.09.2012アクティブ
12:00:00 27.09.201214:00:0027.09.2012寝ている
14:00:00 27.09.201215:00:0027.09.2012アクティブ

そのような結果を作成するためのSQLイディオムはありますか?私はMySQLを使用していますが、他のSQL方言を教えていただければ、奇妙なベンダー機能を使用していない限り、それを翻訳することもできます。

4

1 に答える 1

3

期間が重複しないと仮定すると、MySQLで相関サブクエリを使用してこれを行うことができます。

 select min(start) as start, max(end) as end, e.status
 from (select e.*,
             (select min(start)
              from event e2
              where e2.status <> e.status and e2.start > e.start
             ) as nextperiodstart
      from event e
     ) e
 group by status, nextperiodstart
 order by 1

これは、次の期間の開始を使用して、実行されているグループを識別します。

ちなみに、ROW_NUMBERMySQLでサポートされていないANSI標準関数であるを使用して、他のほとんどのデータベースではこれを非常に異なる方法で実行します。「奇妙なベンダー機能」と呼ぶものに注意してください。ほとんどのデータベースは、何らかの方法で標準から逸脱しています。これは、MySQLが逸脱する1つの方法です。

于 2012-09-27T13:12:44.620 に答える