SQL - 如何随机选择一个有序的子集?
SQL - How to randomly choose an ordered subset?
我有一个 table 大致是这样的:
id | unique | group
----------------------------------
1 | aaa | group1
2 | bbb | group1
3 | ggg | group1
4 | iii | group2
5 | ooo | group2
6 | eee | group3
7 | ttt | group4
8 | qqq | group4
9 | nnn | group4
我想从这个 table 中选择一个大小约为 N
的随机子集。 N
条目应属于 group
的子集,无论哪个 group
,无论组大小如何,它们都应在组级别随机排序。例如,对于 N==3
,我想要
[ooo, iii, eee]
(即来自 group2 的条目,然后是 group3)或
[eee, iii, ooo]
(即来自 group3 的条目,然后是 group2)或
[ttt, nnn, qqq]
(即来自组 4 的条目)或
[qqq, nnn, ttt]
(即来自组 4 的条目)或
[eee, ggg, bbb, aaa]
(即来自 group3 的条目,然后是 group1)或
...
我可以不选择组 "completely"。
我不经常这样做,我更喜欢多个查询而不是一个复杂的查询。 N
将在 100
左右,table 有 <10k 个条目,程序 运行 每天一次。 N
不需要精确匹配。我在 Python/Mysqldb 中这样做,但我对一般 algorithm/approach.
很感兴趣
此外,一旦处理了 N
个条目,我想在下一个 运行 中忽略它们,方法是简单地删除它们或设置一些附加属性。在后一种情况下,需要调整查询。
编辑: 已更改以作澄清。
我不知道这是否是最佳解决方案,但至少它是一个解决方案。不幸的是,MySQL 不允许在子查询中使用 LIMIT,因此我使用了变量。
SELECT组
从我的表
按组分组
有计数(唯一)= 3
按 rand() 排序
限制 1
INTO @randomgroup;
SELECT独一无二
从我的表
WHERE 组 = @randomgroup
按唯一顺序排序;
我有一个 table 大致是这样的:
id | unique | group
----------------------------------
1 | aaa | group1
2 | bbb | group1
3 | ggg | group1
4 | iii | group2
5 | ooo | group2
6 | eee | group3
7 | ttt | group4
8 | qqq | group4
9 | nnn | group4
我想从这个 table 中选择一个大小约为 N
的随机子集。 N
条目应属于 group
的子集,无论哪个 group
,无论组大小如何,它们都应在组级别随机排序。例如,对于 N==3
,我想要
[ooo, iii, eee]
(即来自 group2 的条目,然后是 group3)或
[eee, iii, ooo]
(即来自 group3 的条目,然后是 group2)或
[ttt, nnn, qqq]
(即来自组 4 的条目)或
[qqq, nnn, ttt]
(即来自组 4 的条目)或
[eee, ggg, bbb, aaa]
(即来自 group3 的条目,然后是 group1)或
...
我可以不选择组 "completely"。
我不经常这样做,我更喜欢多个查询而不是一个复杂的查询。 N
将在 100
左右,table 有 <10k 个条目,程序 运行 每天一次。 N
不需要精确匹配。我在 Python/Mysqldb 中这样做,但我对一般 algorithm/approach.
此外,一旦处理了 N
个条目,我想在下一个 运行 中忽略它们,方法是简单地删除它们或设置一些附加属性。在后一种情况下,需要调整查询。
编辑: 已更改以作澄清。
我不知道这是否是最佳解决方案,但至少它是一个解决方案。不幸的是,MySQL 不允许在子查询中使用 LIMIT,因此我使用了变量。
SELECT组 从我的表 按组分组 有计数(唯一)= 3 按 rand() 排序 限制 1 INTO @randomgroup;
SELECT独一无二 从我的表 WHERE 组 = @randomgroup 按唯一顺序排序;