Count(*) возвращает разные результаты при каждом выполнении

Обратите внимание: этот вопрос касается PostgreSQL и pgAdmin4, поэтому он не является дубликатом использования COUNT, который возвращает разные результаты, что касается MySQL.


У меня есть ~4 000 000 записей. Следующий запрос SQL:

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

возвращает другое значение каждый раз, когда я его выполняю. В чем проблема и как я могу это исправить?

1 ответ

Решение

Это ваш запрос:

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

Произвольный <> случайный. (Примечание: это дорого; есть более дешевые способы получить случайный набор.).

Если вы хотите повторить образец, ну, есть разные способы сделать это. Один из них - отсортировать по уникальному идентификатору и взять первые 40000 строк:

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

Это не случайная выборка, а повторяемая выборка.

Другие вопросы по тегам