0

私は次のように構成されたテーブルを持っています:

fake_id          start          end          misc_data
------------------------------------------------------
1                101            105          ab
1                101            105          cd
1                101            105          ef
2                117            123          gh
2                117            123          ij
2                117            123          kl
2                117            123          mn
3                51             53           op
3                51             53           qr

fake_idフィールドは実際には主キーではありませんが、startとendで指定された範囲内の個別の奇数の数に等しい回数繰り返されることに注意してください。各レコードの実際のIDは、その範囲の奇数の1つです。次のように、fake_id、misc_data、およびこれらの奇数を含む別の列を返すクエリを記述して、実際のIDを生成する必要があります。

fake_id          real_id          misc_data
------------------------------------------
1                101              ab
1                103              cd
1                105              ef
2                117              gh
2                119              ij
2                121              kl
2                123              mn
3                51               op
3                53               qr

私の知る限り、シーケンスにギャップがないという保証はありません(たとえば、範囲21〜31のレコードがない可能性があります)。特定のfake_idを持つ各レコードについて、開始と終了の間の次の奇数を返す必要があることをクエリ(またはプロシージャ、ただしクエリが望ましい)に伝えるにはどうすればよいですか?

また、misc_dataの値を特定のreal_idに属するようにする方法はありますか?2番目の表を例として使用すると、「ab」が103ではなくreal_id 101に属していることをクエリにどのように伝えることができますか?

前もって感謝します。

4

2 に答える 2

4

ここで、並べ替えを計画していると推測しますmisc_data

SELECT "fake_id",
       ((ROW_NUMBER()OVER(PARTITION BY "start"
                        ORDER BY "misc_data")-1)*2)+"start" AS "real_id",
       "misc_data"
FROM t
ORDER BY "misc_data";

http://www.sqlfiddle.com/#!4/ae23c/23

于 2012-05-24T01:37:36.007 に答える
0

すぐに返信しないこと、または個々のコメントに返信することをお詫びします。@John Dewey、あなたのスクリプトを試したとき、最初と最後のシリーズの間のギャップを正しく維持できなかったPARTITIONと思いますが、キーワードについてもっと学びたいという動機があり、今はもっと啓発されていると思います.

これは ETL タスクのためだったので、抽出 (変換としてもカウントされると思います) 側のループで実際の ID を生成するコードを書くことになりました。

于 2012-07-06T20:37:00.430 に答える