循环through/Update结果直到列的总和(bigint)小于指定的数字
Loop through/Update the result until sum of a column(bigint) is less than a specified number
我有一个包含 5 列的 table - [ID]、[Name]、[Comment]、[Status] 和 [Size]。
[Status] 列需要为所有行更新,但只需要更新到 [Size] 列的值总和小于 100。如果总和超过 100,则将在下次调用时更新剩余行。
我能够使用 SUM 函数获取列中值的总和,但在迭代它时遇到问题。
请帮忙。
===============================
我会尽量提供更多细节
这是table数据
ID Name Status size comment
1 File1 Pass 20 Transmitted
2 File2 Pass 30 Transmitted
3 File3 Pass 50 Transmitted
4 File4 Pass 10 Transmitted
我想运行更新查询:
Update [sample_table]
set status ='Completed'
where SUM(size)<100
因此,它应该更新 File1、File2 和 File3 的状态。剩余的 File4 将在下一次迭代中更新。
现在清楚了吗还是需要更多细节?
我解决这个问题的唯一方法是在您的更新中使用 CTE。
您可以在 SSMS 中运行以下示例:
-- Sample schema.
DECLARE @Data TABLE (
ID INT, [Name] VARCHAR(50), [Status] VARCHAR(50), [Size] INT, [Comment] VARCHAR(50)
);
-- Sample data.
INSERT INTO @Data ( ID, [Name], [Status], [Size], [Comment] ) VALUES
( 1, 'File1', 'Pass', 20, 'Transmitted' ),
( 2, 'File2', 'Pass', 30, 'Transmitted' ),
( 3, 'File3', 'Pass', 50, 'Transmitted' ),
( 4, 'File4', 'Pass', 10, 'Transmitted' );
-- Update all record's [Comment] to 'Completed' with a SizeTotal <= 100.
WITH running_size AS (
SELECT ID, SizeTotal = Size FROM @Data WHERE ID = 1
UNION ALL
SELECT
d.ID, running_size.SizeTotal + d.Size
FROM running_size
INNER JOIN @Data d ON d.ID = ( running_size.ID + 1 )
)
UPDATE @Data
SET
[Comment] = 'Completed'
FROM @Data d
INNER JOIN running_size rs
ON d.ID = rs.ID
WHERE
rs.SizeTotal <= 100;
-- Show me the money.
SELECT * FROM @Data ORDER BY ID;
Returns:
+----+-------+--------+------+-------------+
| ID | Name | Status | Size | Comment |
+----+-------+--------+------+-------------+
| 1 | File1 | Pass | 20 | Completed |
| 2 | File2 | Pass | 30 | Completed |
| 3 | File3 | Pass | 50 | Completed |
| 4 | File4 | Pass | 10 | Transmitted |
+----+-------+--------+------+-------------+
我想这就是您想要实现的目标吧?
我有一个包含 5 列的 table - [ID]、[Name]、[Comment]、[Status] 和 [Size]。 [Status] 列需要为所有行更新,但只需要更新到 [Size] 列的值总和小于 100。如果总和超过 100,则将在下次调用时更新剩余行。
我能够使用 SUM 函数获取列中值的总和,但在迭代它时遇到问题。
请帮忙。
===============================
我会尽量提供更多细节
这是table数据
ID Name Status size comment
1 File1 Pass 20 Transmitted
2 File2 Pass 30 Transmitted
3 File3 Pass 50 Transmitted
4 File4 Pass 10 Transmitted
我想运行更新查询:
Update [sample_table]
set status ='Completed'
where SUM(size)<100
因此,它应该更新 File1、File2 和 File3 的状态。剩余的 File4 将在下一次迭代中更新。
现在清楚了吗还是需要更多细节?
我解决这个问题的唯一方法是在您的更新中使用 CTE。
您可以在 SSMS 中运行以下示例:
-- Sample schema.
DECLARE @Data TABLE (
ID INT, [Name] VARCHAR(50), [Status] VARCHAR(50), [Size] INT, [Comment] VARCHAR(50)
);
-- Sample data.
INSERT INTO @Data ( ID, [Name], [Status], [Size], [Comment] ) VALUES
( 1, 'File1', 'Pass', 20, 'Transmitted' ),
( 2, 'File2', 'Pass', 30, 'Transmitted' ),
( 3, 'File3', 'Pass', 50, 'Transmitted' ),
( 4, 'File4', 'Pass', 10, 'Transmitted' );
-- Update all record's [Comment] to 'Completed' with a SizeTotal <= 100.
WITH running_size AS (
SELECT ID, SizeTotal = Size FROM @Data WHERE ID = 1
UNION ALL
SELECT
d.ID, running_size.SizeTotal + d.Size
FROM running_size
INNER JOIN @Data d ON d.ID = ( running_size.ID + 1 )
)
UPDATE @Data
SET
[Comment] = 'Completed'
FROM @Data d
INNER JOIN running_size rs
ON d.ID = rs.ID
WHERE
rs.SizeTotal <= 100;
-- Show me the money.
SELECT * FROM @Data ORDER BY ID;
Returns:
+----+-------+--------+------+-------------+
| ID | Name | Status | Size | Comment |
+----+-------+--------+------+-------------+
| 1 | File1 | Pass | 20 | Completed |
| 2 | File2 | Pass | 30 | Completed |
| 3 | File3 | Pass | 50 | Completed |
| 4 | File4 | Pass | 10 | Transmitted |
+----+-------+--------+------+-------------+
我想这就是您想要实现的目标吧?