add batch
remove batch
split batch
comment selection
show hidden batches
hide batch
highlight batch
db<>fiddle
Db2
Firebird
MariaDB
MySQL
Node.js
Oracle
Postgres
SQLite
SQL Server
TimescaleDB
YugabyteDB
Developer-C 11.1
3.0
4.0
10.2
10.3
10.4
10.5
10.6
10.7
10.8
10.9
5.5
5.6
5.7
8.0
18
11g Release 2
18c
21c
23c
8.4
9.3
9.4
9.5
9.6
10
11
12
13
14
15
16
3.8
3.16
3.27
3.39
2012
2014
2016
2017
2017 (Linux)
2019
2019 (Linux)
2022
2.11
2.6
2.8
2.18
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
Sakila
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
no sample DB
AdventureWorks
no sample DB
no sample DB
AdventureWorks
no sample DB
no sample DB
no sample DB
no sample DB
run
markdown
donate
feedback
about
By using db<>fiddle, you agree to license everything you submit by
Creative Commons CC0
.
CREATE TABLE `multiqueue` ( `ID` BIGINT(20) NOT NULL AUTO_INCREMENT, `CustomerID` BIGINT(20) NOT NULL, `Volume` INT(11) NOT NULL, `Content` MEDIUMTEXT NOT NULL COLLATE 'utf8mb4_unicode_ci', `PublishedTS` DATETIME NULL DEFAULT NULL, PRIMARY KEY (`ID`) USING BTREE ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB;
CREATE TABLE `customers` ( `ID` BIGINT(20) NOT NULL AUTO_INCREMENT, `Priority` DOUBLE NOT NULL DEFAULT '1000', PRIMARY KEY (`ID`) USING BTREE ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB;
INSERT INTO multiqueue VALUES (1, 1, 100, 'Content1', NULL), (2, 1, 200, 'Content2', NULL), (3, 1, 300, 'Content3', NULL), (4, 1, 400, 'Content4', NULL), (5, 1, 500, 'Content5', NULL), (6, 2, 100, 'Content6', NULL), (7, 2, 200, 'Content7', NULL), (8, 2, 300, 'Content8', NULL), (9, 2, 400, 'Content9', NULL), (10, 2, 500, 'Content10', NULL), (11, 1, 600, 'Content11', NULL) ;
INSERT INTO customers VALUES (1, 1000), (2, 500), (3, 100000) ;
SELECT q.ID, q.Content, q.Volume, q.CustomerID, q.runtot FROM ( SELECT ID, Content, Volume, CustomerID, SUM(Volume) OVER (PARTITION BY CustomerID ORDER BY ID ASC) AS runtot, ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY ID ASC) AS rnum FROM multiqueue WHERE PublishedTS IS NULL ) AS q INNER JOIN ( SELECT ID, Priority, SUM(Priority) OVER () AS TotalPriority FROM customers AS c WHERE EXISTS ( SELECT * FROM multiqueue AS q WHERE q.PublishedTS IS NULL AND q.CustomerID = c.ID ) ) AS c ON q.CustomerID = c.ID WHERE q.runtot < 2000 * c.Priority / c.TotalPriority OR q.rnum <= 1 ORDER BY q.ID ASC ;
ID
Content
Volume
CustomerID
runtot
1
Content1
100
1
100
2
Content2
200
1
300
3
Content3
300
1
600
4
Content4
400
1
1000
6
Content6
100
2
100
7
Content7
200
2
300
8
Content8
300
2
600