SQL选择随机插入的分组结果
对于具有ID和category列的表,我们将有一个具有5个值的类别域,例如a、B、C、D和E 我们正在使用SQLite 我们的目标是创建一个查询,在每组5行中随机选择并随机排序若干插入的分组行,例如 ID CAT --- --- 076 C 753 D 503 A 081 B 335 E 475 B 643 D 995 A 105 E 549 C 553 E 871 B 064 C 720 D 119 A 上面的示例显示了3组os结果,它们的行是随机选择的,其排序也是随机的 目前,我们正在使用5个查询来提取结果,每个类别一个查询,然后根据应用程序代码对所有内容进行排序 从表中选择*,其中cat='A'顺序由随机限制3决定SQL选择随机插入的分组结果,sql,sqlite,random,group-by,sql-order-by,Sql,Sqlite,Random,Group By,Sql Order By,对于具有ID和category列的表,我们将有一个具有5个值的类别域,例如a、B、C、D和E 我们正在使用SQLite 我们的目标是创建一个查询,在每组5行中随机选择并随机排序若干插入的分组行,例如 ID CAT --- --- 076 C 753 D 503 A 081 B 335 E 475 B 643 D 995 A 105 E 549 C 553 E 871 B 064 C 720 D
如果有人通过使用单个查询建议更好的解决方案,我们将不胜感激。您可以将以下查询用于3个联合体,虽然不是很短,但它确实起到了作用:
SELECT randomized.id, randomized.cat
FROM (
SELECT randomized.id, randomized.cat
FROM (
SELECT id,cat FROM `table_test` ORDER BY RANDOM()
) AS randomized
GROUP BY cat
ORDER BY RANDOM()
) AS randomized
UNION ALL
SELECT randomized.id, randomized.cat
FROM (
SELECT randomized.id, randomized.cat
FROM (
SELECT id,cat FROM `table_test` ORDER BY RANDOM()
) AS randomized
GROUP BY cat
ORDER BY RANDOM()
) AS randomized
UNION ALL
SELECT randomized.id, randomized.cat
FROM (
SELECT randomized.id, randomized.cat
FROM (
SELECT id,cat FROM `table_test` ORDER BY RANDOM()
) AS randomized
GROUP BY cat
ORDER BY RANDOM()
) AS randomized
您可以将以下查询用于3个联合体,它不是很短,但它完成了它的工作:
SELECT randomized.id, randomized.cat
FROM (
SELECT randomized.id, randomized.cat
FROM (
SELECT id,cat FROM `table_test` ORDER BY RANDOM()
) AS randomized
GROUP BY cat
ORDER BY RANDOM()
) AS randomized
UNION ALL
SELECT randomized.id, randomized.cat
FROM (
SELECT randomized.id, randomized.cat
FROM (
SELECT id,cat FROM `table_test` ORDER BY RANDOM()
) AS randomized
GROUP BY cat
ORDER BY RANDOM()
) AS randomized
UNION ALL
SELECT randomized.id, randomized.cat
FROM (
SELECT randomized.id, randomized.cat
FROM (
SELECT id,cat FROM `table_test` ORDER BY RANDOM()
) AS randomized
GROUP BY cat
ORDER BY RANDOM()
) AS randomized
可以使用五个临时表为每个类别中的行分配ID:
CREATE TEMPORARY TABLE a(nr INTEGER PRIMARY KEY, id);
CREATE TEMPORARY TABLE b(nr INTEGER PRIMARY KEY, id);
...
INSERT INTO temp.a(id) SELECT id FROM MyTable WHERE cat = 'A' ORDER BY random();
INSERT INTO temp.b(id) SELECT id FROM MyTable WHERE cat = 'B' ORDER BY random();
...
然后可以组合这五个表,以便将具有相同nr值的行排序在一起:
SELECT nr, id, 'A' AS cat, random() AS r FROM temp.a
UNION ALL
SELECT nr, id, 'B', random() FROM temp.b
UNION ALL
...
ORDER BY nr, r;
可以使用五个临时表为每个类别中的行分配ID:
CREATE TEMPORARY TABLE a(nr INTEGER PRIMARY KEY, id);
CREATE TEMPORARY TABLE b(nr INTEGER PRIMARY KEY, id);
...
INSERT INTO temp.a(id) SELECT id FROM MyTable WHERE cat = 'A' ORDER BY random();
INSERT INTO temp.b(id) SELECT id FROM MyTable WHERE cat = 'B' ORDER BY random();
...
然后可以组合这五个表,以便将具有相同nr值的行排序在一起:
SELECT nr, id, 'A' AS cat, random() AS r FROM temp.a
UNION ALL
SELECT nr, id, 'B', random() FROM temp.b
UNION ALL
...
ORDER BY nr, r;
开发了一种获得我们需要的结果的方法:连续的行块,每个行块没有“cat”重复,并且根本没有“id”重复 它更面向数学,而不是面向查询,但无论如何,它适合我们的需要
CREATE TEMPORARY TABLE a(nr INTEGER PRIMARY KEY, sort, id, cat);
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'A' ORDER BY random() limit 3;
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'B' ORDER BY random() limit 3;
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'C' ORDER BY random() limit 3;
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'D' ORDER BY random() limit 3;
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'E' ORDER BY random() limit 3;
UPDATE temp.a SET sort=100 where nr=1;
UPDATE temp.a SET sort=92+(select abs(random()%(2))*16) where nr=4;
UPDATE temp.a SET sort=88+(select abs(random()%(4))*8) where nr=7;
UPDATE temp.a SET sort=86+(select abs(random()%(8))*4) where nr=10;
UPDATE temp.a SET sort=85+(select abs(random()%(16))*2) where nr=13;
UPDATE temp.a SET sort=200 where nr=2;
UPDATE temp.a SET sort=192+(select abs(random()%(2))*16) where nr=5;
UPDATE temp.a SET sort=188+(select abs(random()%(4))*8) where nr=8;
UPDATE temp.a SET sort=186+(select abs(random()%(8))*4) where nr=11;
UPDATE temp.a SET sort=185+(select abs(random()%(16))*2) where nr=14;
UPDATE temp.a SET sort=300 where nr=3;
UPDATE temp.a SET sort=292+(select abs(random()%(2))*16) where nr=6;
UPDATE temp.a SET sort=288+(select abs(random()%(4))*8) where nr=9;
UPDATE temp.a SET sort=286+(select abs(random()%(8))*4) where nr=12;
UPDATE temp.a SET sort=285+(select abs(random()%(16))*2) where nr=15;
SELECT id, cat FROM temp.a ORDER BY sort;
DROP TABLE a;
开发了一种获得我们需要的结果的方法:连续的行块,每个行块没有“cat”重复,并且根本没有“id”重复 它更面向数学,而不是面向查询,但无论如何,它适合我们的需要
CREATE TEMPORARY TABLE a(nr INTEGER PRIMARY KEY, sort, id, cat);
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'A' ORDER BY random() limit 3;
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'B' ORDER BY random() limit 3;
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'C' ORDER BY random() limit 3;
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'D' ORDER BY random() limit 3;
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'E' ORDER BY random() limit 3;
UPDATE temp.a SET sort=100 where nr=1;
UPDATE temp.a SET sort=92+(select abs(random()%(2))*16) where nr=4;
UPDATE temp.a SET sort=88+(select abs(random()%(4))*8) where nr=7;
UPDATE temp.a SET sort=86+(select abs(random()%(8))*4) where nr=10;
UPDATE temp.a SET sort=85+(select abs(random()%(16))*2) where nr=13;
UPDATE temp.a SET sort=200 where nr=2;
UPDATE temp.a SET sort=192+(select abs(random()%(2))*16) where nr=5;
UPDATE temp.a SET sort=188+(select abs(random()%(4))*8) where nr=8;
UPDATE temp.a SET sort=186+(select abs(random()%(8))*4) where nr=11;
UPDATE temp.a SET sort=185+(select abs(random()%(16))*2) where nr=14;
UPDATE temp.a SET sort=300 where nr=3;
UPDATE temp.a SET sort=292+(select abs(random()%(2))*16) where nr=6;
UPDATE temp.a SET sort=288+(select abs(random()%(4))*8) where nr=9;
UPDATE temp.a SET sort=286+(select abs(random()%(8))*4) where nr=12;
UPDATE temp.a SET sort=285+(select abs(random()%(16))*2) where nr=15;
SELECT id, cat FROM temp.a ORDER BY sort;
DROP TABLE a;
您可以使用UNION子句向服务器发出单个查询,您可以在@rubens amaralThank You@DanIonescu中找到一个示例作为您的建议,但是我的要求呢?很抱歉,但是使用UNION我不知道如何实现这一点。你想让3组结果的类别每次都是唯一的,还是maby B,D,A,C,B是可接受的@rubens amaral?是的,每个组都应该有唯一的类别,所以B,D,A,C,B是不可接受的。你可以使用UNION子句向服务器发出单个查询,你可以找一个例子@rubens amaralThank you@DanIonescu作为你的建议,但是我的要求呢?很抱歉,但使用UNION我不知道如何实现这一点。你想让三组结果的类别每次都是唯一的,还是说maby B、D、A、C、B是可以接受的@rubens amaral?是的,每个组都应该有唯一的类别,所以B、D、A、C、B是不可接受的再次感谢@DanIonescu。实际上,查询应该没有重复的结果行。您的查询可以防止每个块内的重复,这是正常的,但当UNION应用时,可能会发生重复。也许没有解决办法,这确实是一个挑战。我们正在尝试使用WHERE子句和/或联接来处理您的建议,这样每个块就不会再从以前的块中提取任何检索到的数据,但仍然没有幸运再次感谢您@DanIonescu。实际上,查询应该没有重复的结果行。您的查询可以防止每个块内的重复,这是正常的,但当UNION应用时,可能会发生重复。也许没有解决办法,这确实是一个挑战。我们正在尝试使用WHERE子句和/或联接来处理您的建议,这样每个块就不会再从上一个块中提取任何检索到的数据,但仍然没有luckHi@CL,谢谢您的建议,但是按nr、random的顺序正在上升一个错误,按术语的第二个顺序与结果集中的任何列都不匹配。我提出了一个关于这个Oops的新问题;现在已修复。您好@CL,谢谢您的建议,但按nr、random排序的顺序正在上升一个错误,按术语排序的第二个顺序与结果集中的任何列都不匹配。我提出了一个关于这个Oops的新问题;现在修好了。