Count(*)在每次执行时返回不同的结果

时间:2018-12-08 16:26:22

标签: sql postgresql pgadmin-4

请注意:这个问题是关于PostgreSQL和pgAdmin4的,因此它不是关于MySQL的Using COUNT returns different results的重复。


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

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

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

1 个答案:

答案 0 :(得分:7)

这是您的查询:

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
     ) ;

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