代码之家  ›  专栏  ›  技术社区  ›  Michael Haddad

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

  •  0
  • Michael Haddad  · 技术社区  · 6 年前

    请注意 :这个问题是关于postgresql和pgadmin4的,因此它不是 Using COUNT returns different results 这是关于mysql的。


    我有大约4000000张唱片表。以下SQL查询:

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

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

    1 回复  |  直到 6 年前
        1
  •  7
  •   Gordon Linoff    6 年前

    这是您的查询:

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

    子查询正在返回 任意的 一组40000行。每次执行查询时,此集合都是不同的。如果需要规范集,则需要 ORDER BY 具有唯一的排序键。

    之后您将进行过滤,因此与您的条件匹配的数字是任意的。

    如果您想在条件为真的情况下任意设置40000行,只需执行以下操作:

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

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

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

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

    如果您想要一个可重复的样本,那么,有各种方法可以做到这一点。一种方法是按类似于唯一ID的内容排序,并取前40000行:

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

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