首页 > 解决方案 > Count(*) 在每次执行时返回不同的结果

问题描述

请注意:这个问题是关于 PostgreSQL 和 pgAdmin4 的,所以它不是重复使用 COUNT 返回不同的结果,这是关于 MySQL 的。


我有一个 ~4,000,000 条记录表。以下 SQL 查询:

SELECT COUNT(*) FROM (SELECT * FROM log LIMIT 40000)a WHERE some_column = true

每次执行时返回不同的值。有什么问题,我该如何解决?

标签: sqlpostgresqlpgadmin-4

解决方案


这是您的查询:

SELECT COUNT(*)
FROM (SELECT * FROM log LIMIT 40000)a
WHERE some_column = true

子查询返回任意一组 40,000 行。每次执行查询时,该集合都不同。如果您想要一个规范集,则需要ORDER BY使用唯一的排序键。

您在之后进行过滤,因此符合您条件的数字是任意的。

如果您想要条件为真的任意 40,000 行集合,只需执行以下操作:

SELECT COUNT(*)
FROM (SELECT l.*
      FROM log
      WHERE some_column = true
      LIMIT 40000
     ) ;

如果您想要一组随机的 40,000 行,您可以执行以下操作:

SELECT COUNT(*)
FROM (SELECT l.*
      FROM log
      WHERE some_column = true
      ORDER BY random() 
      LIMIT 40000
     ) ;

任意<>随机。(注意:这很昂贵;有更便宜的方法可以获得随机集。)。

如果您想要一个可重复的样本,那么有多种方法可以做到这一点。一种是按唯一 id 之类的东西排序并取前 40,000 行:

SELECT COUNT(*)
FROM (SELECT l.*
      FROM log l
      WHERE some_column = true
      ORDER BY primary_key
      LIMIT 40000
     ) ;

这不是一个随机样本,只是一个可重复的样本。


推荐阅读