簡體   English   中英

限制基於分組依據的查詢結果

[英]limit the result of a query based on group by

我正在對oracle進行查詢,以更新表中的令牌以對標記的行做一些工作。

我的問題是我想將每次更新的行數限制為特定的批處理大小,並按結果分組。

我很難用抽象的術語來解釋,因此我將具體化。

假設我有一個名為“ staging”的表,其中包含以下字段:(Id,IdFile分組,名稱,地址1,地址2,地址3,國家/地區,令牌)

我想做的是創建一個查詢來批量處理此信息。

對於每個批次,我都會更新令牌,以便將這些記錄標記為以后可以使用。 我想要按文件進行批處理,並且每個批處理都有大小限制,所以我正在使用rownum對其進行限制。 我的另一個限制是按批次分組。

假設我的批處理大小為5,並且如果我只有3行並且只有3行填充了分組列,那么我必須創建只有3行的批處理。

這是我最大的煩惱,因為當我進行分組時,無論有沒有分組,我都會得到一批結果。 (如果有分組,則必須查看所有行的目的地地址是否相同,並使用它創建一個批處理。)

您可以幫助我了解如何創建此查詢嗎?

我現在正在使用的是:

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

如此...有人有什么想法嗎?

干杯

我不確定是否完全了解所有要求的詳細信息,但是根據您的示例數據和所需的輸出,以下查詢將起作用:

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部分desc nulls FIRST 讓我知道查詢是否解決了您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM