gpt4 book ai didi

mysql - 从没有变量的表中选择分层样本

转载 作者:太空宇宙 更新时间:2023-11-03 12:09:45 25 4
gpt4 key购买 nike

我需要获取我的大表的分层样本。具体来说,我想从我的表中选择 1/n 行没有偏见,即随机选择,选择每第 n 行等。

在我问这个问题之前,我试着做 this 。但是,它对我不起作用,因为我使用的是 InfiniDB 引擎,而且正如我后来发现的那样,它不支持子表达式中的变量或类似的东西。有谁知道没有用户变量的方法吗?

我在想这样的事情:在我的表中,每一行都有一个唯一的字母数字字符串 id,它可以看起来像“1234567890”,或者像“abcdef12345”。我正在考虑以某种方式将该字符串转换为数字,然后使用取模函数仅从我的表中选择 1/n 行。但是,我不知道如何进行转换,因为这个字符串不是十六进制的。

注意:我的表没有有一个自动递增的列。

最佳答案

这很复杂,但你可以做到。它需要使用相关子查询在此查询中实现的自连接和聚合。我的猜测是这不会很好地执行,因为您可能有一张大 table 。对于 10% 的样本,它看起来像:

select ht.*,
(select count(*)
from hugetable ht2
where ht2.col < ht.col or
(ht2.col = ht.col and ht2.id <= ht.id)
) as rn
from hugetable ht
having rn % 10 = 1;

请注意,在此上下文中使用 having 是 MySQL 特有的。它允许您在不使用子查询的情况下过滤行。

编辑:

可能唯一可行的方法——如果你能做到的话——是创建另一个具有自动递增 ID 的表。这是精简版:

create table temp (
id int auto_increment,
idstring varchar(255),
col varchar(255)
);

insert into temp(idstring, col)
select idstring, col
from hugetable ht
order by col;

select *
from temp
where id % 10 = 1;

关于mysql - 从没有变量的表中选择分层样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24865293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com