1

マークされた行でいくつかの作業を行うために、テーブル内のトークンを更新するためにオラクルでクエリを実行しています。

私の問題は、毎回更新される行数を特定のバッチサイズと結果によるグループに制限したいということです。

抽象的な言葉で説明するのはちょっと難しいので、具体化します。

次のフィールドを持つ「ステージング」というテーブルがあるとします: (Id、IdFile Grouping、Name、Address1、Address2、Address3、Country、Token)

私がやろうとしているのは、この情報でバッチを実行するためのクエリを作成することです。

バッチごとにトークンを更新して、それらのレコードが後で機能するようにマークします。ファイルごとにバッチが必要で、各バッチにはサイズ制限があるため、rownum を使用して制限しています。私が持っているもう1つの制限は、バッチによるグループ化です。

バッチ サイズが 5 で、グループ化列が 3 行しかない場合、その 3 行だけでバッチを作成する必要があります。

これは、グループ化を行っているときに、グループ化の有無にかかわらず 1 つのバッチ結果しか得られないため、私の最大の不満です。(グループ化した場合、宛先アドレスがすべての行で同じかどうかを確認し、それを使用してバッチを作成する必要がありました。)

このクエリを作成する方法を理解するのを手伝ってもらえますか?

私が今使っているのは:

update schema.staging set
token = 'token4'
where id in ( select t.id
               from (
    select stage.id, stage.grouping 
    from (select idFile 
            from (select a.idFile
                  from schema.staging a
                  inner join schema.config c on c.id = a.idcfgpriority
                  where nvl2(a.token,0,1) = 1
                  group by a.idFile, c.order
                  order by c.order desc) files 
            where rownum = 1 ) priorityFile
          inner join schema.staging stage on stage.idFile = priorityFile.idFile
        where nvl2(stage.token,0,1) = 1 
        group by stage.idFile, stage.token, stage.id, grouping sets ( (stage.grouping),
                                                                          (stage.name, stage.Address1,stage.Address2,stage.Address3,stage.Country))
        order by stage.grouping
    ) t
where rownum <= 5 )

次のデータの場合:

 Id IdFile  Grouping    Name    Address1    Address2    Address3    Country     Token
 ====================================================================================
 1  1       null        Name1   Address1    Address1    Address1    Country     null
 2  1       1           Name1   Address1    Address1    Address1    Country     null
 3  1       1           Name1   Address1    Address1    Address1    Country     null
 4  1       1           Name1   Address1    Address1    Address1    Country     null
 5  1       2           Name1   Address1    Address1    Address1    Country     null
 6  1       2           LALAL   XPTO        Address1    Address1    Country     null
 7  1       null        Name1   Address1    Address1    Address1    Country     null
 8  1       null        Name1   Address1    Address1    Address1    Country     null
 9  1       null        Name1   Address1    Address1    Address1    Country     null
 10 2       null        Name1   Address1    Address1    Address1    Country     null
 11 2       null        Name1   Address1    Address1    Address1    Country     null
 12 2       null        Name1   Address1    Address1    Address1    Country     null
 13 2       null        Name1   Address1    Address1    Address1    Country     null
 14 2       null        Name1   Address1    Address1    Address1    Country     null
 15 2       null        Name1   Address1    Address1    Address1    Country     null

私は6つのバッチを期待しています。

batch#1: 1, 7, 8, 9
batch#2: 2, 3, 4
batch#3: 5
batch#4: 6
batch#5: 10, 11, 12, 13, 14
batch#6: 15

すっごく...誰かアイデアはありますか?

乾杯

4

1 に答える 1

1

すべての要件を詳細に完全に理解しているかどうかはわかりませんが、サンプルデータと目的の出力に基づいて、次のクエリが機能します。

SELECT dense_rank() over(ORDER BY "IdFile",
                                  "Grouping" nulls FIRST,
                                  "Name" desc,
                                  "Address1",
                                  "Address2",
                                  "Address3",
                                  "Country",
                                  "Token",
                                  row_num) batch_num,
       q.*
  FROM (SELECT trunc((row_number()
                      over(partition BY "IdFile",
                           "Grouping",
                           "Name",
                           "Address1",
                           "Address2",
                           "Address3",
                           "Country",
                           "Token" ORDER BY "Id") - 1) / 5) row_num,
               s.*
          FROM sample s) q
 ORDER BY "Id";

結果:

| BATCH_NUM | ROW_NUM | ID | IDFILE | GROUPING |  NAME | ADDRESS1 | ADDRESS2 | ADDRESS3 | COUNTRY |  TOKEN |
|-----------|---------|----|--------|----------|-------|----------|----------|----------|---------|--------|
|         1 |       0 |  1 |      1 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         2 |       0 |  2 |      1 |        1 | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         2 |       0 |  3 |      1 |        1 | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         2 |       0 |  4 |      1 |        1 | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         3 |       0 |  5 |      1 |        2 | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         4 |       0 |  6 |      1 |        2 | LALAL |     XPTO | Address1 | Address1 | Country | (null) |
|         1 |       0 |  7 |      1 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         1 |       0 |  8 |      1 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         1 |       0 |  9 |      1 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         5 |       0 | 10 |      2 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         5 |       0 | 11 |      2 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         5 |       0 | 12 |      2 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         5 |       0 | 13 |      2 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         5 |       0 | 14 |      2 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |
|         6 |       1 | 15 |      2 |   (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) |

SQLフィドル

あなたが提供したバッチ番号を完全にシミュレートするために、注文で少し遊んでみました. desc安心してnulls FIRSTパーツを廃棄できます。クエリで問題が解決するかどうかお知らせください。

于 2014-02-25T08:00:57.500 に答える