2

少しグーグルで調べてみると、これは興味深い質問であることがわかりました。ショットをお願いします。

私のテーブルを持つ

USER    |   MAP |   STARTDAY    |   ENDDAY
1       |   A   |   20110101    |   20110105
1       |   B   |   20110106    |   20110110
2       |   A   |   20110101    |   20110107
2       |   B   |   20110105    |   20110110

私が望むのは、ユーザーの2ケースを修正することです。ここでは、マップABオーバーラップが数日 (20110105 から 20110107 まで) あります。重複する範囲が返されないように、そのテーブルをクエリできたらいいのにと思います。BETWEEN私の入力データはすでに間違っているので、競合処理について心配する必要はありません。これらの日付に対して単一の値を取得できるようにしたいだけです。

作成しようとしているクエリの可能な出力は次のようになります

USER    |   MAP |   STARTDAY    |   ENDDAY
2       |   B   |   20110108    |   20110110 -- pushed overlapping days ahead..
2       |   A   |   20110101    |   20110104 -- shrunk overlapping range

20110105アルゴリズムが「無効な範囲」を引き起こすかどうかは問題ではありません20110103

あなたたちは何と言うでしょうか?これを行う簡単な方法はありますか?

ありがとう!

f.

4

1 に答える 1

4

分析関数は次のことに役立ちます。

select userid, map
, case when prevend >= startday then prevend+1 else startday end newstart
, endday
from
( select userid, map, startday, endday
  , lag(endday) over (partition by userid order by startday) prevend
  from mytable
)
order by userid, startday

与える:

USERID  MAP     NEWSTART        ENDDAY
1       A       01/01/2011      01/05/2011
1       B       01/06/2011      01/10/2011
2       A       01/01/2011      01/07/2011
2       B       01/08/2011      01/10/2011
于 2011-05-20T11:21:49.037 に答える