Count (*) возвращает разные результаты при каждом выполнении - PullRequest
0 голосов
/ 08 декабря 2018

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


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

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

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

1 Ответ

0 голосов
/ 08 декабря 2018

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

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

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

...