![](/img/trans.png)
[英]Is there a way to limit a query based on the result of another in mySQL?
[英]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.