0

IDごとに「イベント」のリストを持つテーブルを使用しています。イベントは、そのIDで表されるオブジェクトが「オン」または「オフ」になったかどうかです。アイテムがこの表にない場合、アイテムはオフとして開始されると想定されます。その時点でオンになっていない場合にのみ、アイテムは合法的にオンにすることができます。

以下に例を示します。

Events
ID   Type    Date
1    On      01-MAY-12
1    Off     01-JUN-12
1    On      05-JUN-12

残念ながら、このデータはひどいものであり、不可能に満ちています。この表の実際の部分は次のとおりです。

Events
ID   Type    Date
1    On      01-MAY-12
1    On      01-MAY-12
1    On      01-JUN-12
1    Off     01-JUL-12
1    Off     01-AUG-12
1    On      05-AUG-12

私がやりたいのは、ジャンク データなしでこのテーブルを返すクエリを作成することです。ここでは、不可能な行 (つまり、アイテムが既にオンになっているときにオンになる行、またはアイテムが既にオフになっているときにオフになる行) が削除されます。

初めてオンにする前に「オフ」になっている場合はあまり気にしません。そのようなケースはないと思います。

したがって、上記のクエリは次を返します。

Events
ID   Type    Date
1    On      01-MAY-12
1    Off     01-JUL-12
1    On      01-AUG-12

これを行う方法について何か考えはありますか?この「条件Xの下で最初の行を返す」というロジックは、私に多くの困難を引き起こしています。最初の列または最初の列から離れたピリオドが必要な場合は、グループ化して分を取得できます。しかし、この場合はどうすればよいでしょうか?

4

1 に答える 1

5

これを書くことができます:

SELECT id,
       type,
       "date"
  FROM ( SELECT id,
                LAG(type) OVER (PARTITION BY id ORDER BY "date") AS prev_type,
                type,
                "date"
           FROM events
       )
 WHERE type <> NVL(prev_type, '-')
 ORDER
    BY "date"
;

ノート:

  • date二重引用符で囲まない限り、実際には有効な列名ではありません。それは実際には列の名前ではないと思いますか?
  • 「最初にオンにする前に「オフ」になっている場合はあまり気にしないので、そのようなケースはないと思います」と書いたので、イニシャルsを削除しないOffことにしましたに変更NVL(prev_type, '-')するだけNVL(prev_type, 'Off')です。
  • idあなたが同じ sと"date"異なるsを持つ 2 つのレコードを持っている場合については心配しませんでしたtype。それらを可能な順序で配置する必要がないことを願っています。それは非常に困難になるからです。
于 2012-09-10T18:50:12.687 に答える