0

私は以下のような表を持っています:

ID, DATE, STATUS
1, 01JAN2012, STOP
1, 04JAN2012, RESTART
2, 01JAN2012, STOP-1
3, 10JAN2012, STOP
4, 15JAN2012, RESTART
5, 01JAN2012, STOP-1
5, 04JAN2012, STOP-2
5, 10JAN2012, STOP
5, 15JAN2012, RESTART

期待される出力:

ID, DATE, STATUS
2, 01JAN2012, STOP-1
3, 10JAN2012, STOP
4, 15JAN2012, RESTART
5, 01JAN2012, STOP-1
5, 04JAN2012, STOP-2

SELECTステートメントで、(STATUS ='RESTART')を持つ同じIDを持つすべてのレコードと、使用可能な場合は1つの連続する前のレコードを除外する必要があります。

4

1 に答える 1

3

2 つの連続した RESTART があった場合にどうなるかは正確にはわかりませんが、そのような複雑さを除けば、次のようなものが必要になると思います。

;WITH myTable AS(
SELECT *,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [DATE]) AS rn
FROM OriginalTable
)
SELECT this.ID, this.DATE, this.STATUS
FROM myTable this
LEFT OUTER JOIN myTable prev ON prev.ID = this.ID and prev.rn = this.rn-1
LEFT OUTER JOIN myTable nxt ON nxt.ID = this.ID and nxt.rn = this.rn+1
WHERE NOT ((this.STATUS= 'RESTART' AND prev.STATUS IS NOT NULL)
           OR (COALESCE(nxt.STATUS,'') = 'RESTART'))

DATE 列の型は date または datetime であると想定していましたが、文字列の場合は、ROW_NUMBER 呼び出しの ORDER BY 部分で日付に変換する必要があります。

于 2012-09-28T19:50:19.340 に答える