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

Sip*_*ipo 0 sql postgresql pgadmin-4

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


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

SELECT COUNT(*) FROM (SELECT * FROM log LIMIT 40000)a WHERE some_column = true
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 7

这是您的查询:

SELECT COUNT(*)
FROM (SELECT * FROM log LIMIT 40000)a
WHERE some_column = true
Run Code Online (Sandbox Code Playgroud)

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

您之后正在过滤,因此符合您条件的数字是任意的.

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

SELECT COUNT(*)
FROM (SELECT l.*
      FROM log
      WHERE some_column = true
      LIMIT 40000
     ) ;
Run Code Online (Sandbox Code Playgroud)

如果你想要一个随机的40,000行,你可以这样做:

SELECT COUNT(*)
FROM (SELECT l.*
      FROM log
      WHERE some_column = true
      ORDER BY random() 
      LIMIT 40000
     ) ;
Run Code Online (Sandbox Code Playgroud)

任意<>随机.(注意:这是昂贵的;有更便宜的方法来获得随机集.).

如果你想要一个可重复的样本,那么有很多方法可以做到这一点.一种是按照类似于唯一ID的方式进行排序,并获取前40,000行:

SELECT COUNT(*)
FROM (SELECT l.*
      FROM log l
      WHERE some_column = true
      ORDER BY primary_key
      LIMIT 40000
     ) ;
Run Code Online (Sandbox Code Playgroud)

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