【问题标题】:SQL - How to randomly choose an ordered subset?SQL - 如何随机选择一个有序的子集?
【发布时间】:2015-05-18 06:34:18
【问题描述】:

我有一张大致如下所示的表格:

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

我想从这个表中选择一个大致大小为N 的随机子集。 N 条目应该属于groups 的子集,无论是哪个group,无论组大小如何,它们都应该在组级别上随机排序。例如,对于N==3,我想要一个

[ooo, iii, eee](即来自 group2 的条目,然后是 group3)或

[eee, iii, ooo](即来自 group3 的条目,然后是 group2)或

[ttt, nnn, qqq](即来自 group4 的条目)或

[qqq, nnn, ttt](即来自 group4 的条目)或

[eee, ggg, bbb, aaa](即来自 group3 的条目,然后是 group1)或

...

没有“完全”选择一个组我很好。

我不经常这样做,我更喜欢多个查询而不是一个复杂的查询。 N 将在 100 左右,该表的条目 N 不需要完全匹配。我在 Python/Mysqldb 中执行此操作,但我对一般算法/方法很感兴趣。

此外,一旦处理了N 条目,我想在下一次运行时忽略它们,要么简单地删除它们,要么设置一些附加属性。在后一种情况下,需要调整查询。

编辑:为澄清而更改。

【问题讨论】:

    标签: python mysql sql random


    【解决方案1】:

    我不知道,这是否是最好的解决方案,但至少它是一个解决方案。不幸的是,MySQL 不允许在子查询中使用 LIMIT,所以我使用了变量。

    选择组 来自我的表 GROUP BY 组 有计数(唯一)= 3 由 rand() 订购 限制 1 进入@randomgroup;

    选择唯一的 来自我的表 WHERE 组 = @randomgroup 按唯一顺序排序;

    【讨论】:

    • 我稍微修改了您的查询:SELECT group FROM mytable ORDER BY rand() LIMIT 1 INTO @randomgroup; SELECT unique FROM mytable WHERE group = @randomgroup ORDER BY rand()。然后我循环执行这个查询,直到我得到我的 N 条目。
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多