Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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
Python 当可能存在重复浮点值时,对单个(统一随机)浮点值的SQL查询_Python_Sql_Sqlite - Fatal编程技术网

Python 当可能存在重复浮点值时,对单个(统一随机)浮点值的SQL查询

Python 当可能存在重复浮点值时,对单个(统一随机)浮点值的SQL查询,python,sql,sqlite,Python,Sql,Sqlite,给定一个表,该表有一个已索引的浮点字段,允许重复,我假设我可以使用以下方法基于下一个最近的浮点值查询行: SELECT * FROM my_table WHERE my_float_column > 0.1234 ORDER BY my_float_column LIMIT 1 我想从这个表中统一查询[0,1]范围内的一个随机行,为此我建议生成一个统一的随机浮点,并将其替换到上面的查询中 从概念上讲,如果我没有想到什么,这似乎应该可以纠正我,除了存在多个相同值的边缘情况。0.5就是这样一

给定一个表,该表有一个已索引的浮点字段,允许重复,我假设我可以使用以下方法基于下一个最近的浮点值查询行:

SELECT * FROM my_table WHERE my_float_column > 0.1234 ORDER BY my_float_column LIMIT 1
我想从这个表中统一查询[0,1]范围内的一个随机行,为此我建议生成一个统一的随机浮点,并将其替换到上面的查询中

从概念上讲,如果我没有想到什么,这似乎应该可以纠正我,除了存在多个相同值的边缘情况。0.5就是这样一种情况,在数据库中有大量相同的0.5浮点值

当我使用随机选择的浮点值查询数据库时,我将得到0.5,均匀概率偏差在0.5和下一个最小浮点值之间的任何间隙处,但是让我们忽略这个细节。然而,当我随机选择0.5值时,我想随机选择任何一行,精确值为0.5


是否有更好的解决方案以随机统一的方式进行查询?或者,有没有解决方案可以确保在这些条件下得到一个限制为1的随机行?

首先,如果您想要相等,您需要相等:

SELECT *
FROM my_table
WHERE my_float_column >= 0.1234
LIMIT 1
否则,如果你通过了0.5,你就永远得不到0.5。还要注意的是,浮点表示法在进行比较时可能很棘手。0.5具有精确表示,但大多数其他值都是近似值,这可能会导致等式比较出现问题。但我将忽略这一点

浮点值也不能很好地表示均匀分布。在0和0.00001之间的数据类型中表示的浮点数要比在0.99999和1.00000之间表示的浮点数多得多。在这样的范围内,定点数字可能是更好的表示

所有这些都表明,你的问题实际上是关于相等值的随机性。首先,您的方法是有缺陷的,因为您只是返回任何大于您想要的值。这更为正确:

SELECT *
FROM my_table
WHERE my_float_column >= 0.1234
ORDER BY my_float_column DESC
LIMIT 1;
要获得随机性,请使用rand作为第二个键:

ORDER BY my_float_column, rand()
为了提高性能,我建议在我的\u float\u列上建立一个索引。rand是性能杀手,因为它阻止使用索引,但您可以修改查询:

SELECT t.*
FROM my_table t
WHERE t.my_float_column >= 0.1234 AND
      t.my_float_column <= (SELECT COALESCE(MIN(t2.my_float_column), t.my_float_column))
                            FROM my_table t2
                            WHERE t2.my_float_column > 0.1234
                           )
ORDER BY my_float_column DESC, rand()
LIMIT 1;

我内心的某些东西在尖叫,这绝对不是随机的。在SQLite中,几乎所有情况下,我认为查询都会返回与插入顺序相关的结果。我不能恰当地证实这一说法,但我真的认为这不是正确的方法。数据是否太大而无法保存在内存中?在重复值的情况下,例如0.5示例,上面的查询将返回确定性行,而不是随机行,这是核心问题。假设表很大,我不想返回所有大于0.5的值。一种解决方案可能是查询范围[0.5,0.5+ε],然后从所有返回的0.5值中随机选择,但在有许多匹配值的情况下,这并不十分优雅。@roganjosh没有ORDER BY,行以任意未定义的顺序返回,这实际上取决于是否使用覆盖索引,窗口函数,连接中的第一个表是什么,等等。忘记添加orderby只是写问题时的疏忽,我已经更新了它。