Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从无变量的表格中选择分层样本_Mysql_Sql_Database_Infinidb - Fatal编程技术网

Mysql 从无变量的表格中选择分层样本

Mysql 从无变量的表格中选择分层样本,mysql,sql,database,infinidb,Mysql,Sql,Database,Infinidb,我需要对我的大桌子进行分层抽样。具体来说,我想从我的表中无偏差地选择1/n行,即随机选择,每n行选择一行,等等 在我问这个问题之前,我试着去做。但是,它对我不起作用,因为我使用的是InfiniDB引擎,而且,正如我后来发现的,它不支持子表达式中的变量,或者类似的东西。有人知道没有用户变量的方法吗 我在想这样的事情:在我的表中,每一行都有一个唯一的字母数字字符串id,它看起来像“1234567890”,或者像“abcdef12345”。我想把这个字符串转换成一个数字,然后使用模函数从我的表中只选择

我需要对我的大桌子进行分层抽样。具体来说,我想从我的表中无偏差地选择1/n行,即随机选择,每n行选择一行,等等

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

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


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

这很复杂,但您可以这样做。它需要一个自连接和聚合,在这个查询中使用一个相关的子查询来实现。我的猜测是,这将不会很好地执行,因为您可能有一个大表。对于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;

这很复杂,但你可以做到。它需要一个自连接和聚合,在这个查询中使用一个相关的子查询来实现。我的猜测是,这将不会很好地执行,因为您可能有一个大表。对于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;

这很复杂,但你可以做到。它需要一个自连接和聚合,在这个查询中使用一个相关的子查询来实现。我的猜测是,这将不会很好地执行,因为您可能有一个大表。对于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;

这很复杂,但你可以做到。它需要一个自连接和聚合,在这个查询中使用一个相关的子查询来实现。我的猜测是,这将不会很好地执行,因为您可能有一个大表。对于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;


选择第n行不是随机的。@DanBracuk是真的,但它也完全无偏,并提供分层样本,这正是我想要的。你的字母数字字符串是十六进制且完全连续吗?@Arth不,很遗憾它不是十六进制。但是,如果“连续”的意思是“没有空格”,那么是的。如何确定给每个值指定哪个字母数字字符串?选择第n行不是随机的。@DanBracuk True,但它也是完全无偏的,并提供分层样本,这就是我想要的。你的字母数字字符串是十六进制的并且完全连续吗?@Arth不,很遗憾它不是十六进制的。但是,如果“连续”的意思是“没有空格”,那么是的。如何确定给每个值指定哪个字母数字字符串?选择第n行不是随机的。@DanBracuk True,但它也是完全无偏的,并提供分层样本,这就是我想要的。你的字母数字字符串是十六进制的并且完全连续吗?@Arth不,很遗憾它不是十六进制的。但是,如果“连续”的意思是“没有空格”,那么是的。如何确定给每个值指定哪个字母数字字符串?选择第n行不是随机的。@DanBracuk True,但它也是完全无偏的,并提供分层样本,这就是我想要的。你的字母数字字符串是十六进制的并且完全连续吗?@Arth不,很遗憾它不是十六进制的。但是,如果“连续”的意思是“没有空格”,那么是的。如何确定给每个值的字母数字字符串?谢谢!我将尝试第一种方法,但第二种方法不起作用,因为InfiniDB不支持约束,例如
AUTO_INCREMENT
@GordonLinoff在第一种方法中从哪里获得
ht1
?这不应该是
ht
?@Arth。我们称之为打字错误。它应该与外部别名相关联,
ht
。谢谢!我将尝试第一种方法,但第二种方法不起作用,因为InfiniDB不支持约束,例如
AUTO_INCREMENT
@GordonLinoff在第一种方法中从哪里获得
ht1
?这不应该是
ht
?@Arth。我们称之为打字错误。它应该与外部别名相关联,
ht
。谢谢!我将尝试第一种方法,但第二种方法不起作用,因为InfiniDB不支持约束,例如
AUTO_INCREMENT
@GordonLinoff在第一种方法中从哪里获得
ht1
?这不应该是
ht
?@Arth。我们称之为打字错误。它应该与外部别名相关联,
ht
。谢谢!我将尝试第一种方法,但第二种方法不起作用,因为InfiniDB不支持约束,例如
AUTO_INCREMENT
@GordonLinoff在第一种方法中从哪里获得
ht1
?这不应该是
ht
?@Arth。我们称之为打字错误。它应该与外部别名
ht
关联。