Выбор случайной выборки из представления в Postgresql - PullRequest
0 голосов
/ 11 января 2019

Я сгенерировал представление из таблицы в PostgreSQL, состоящей из 50000 строк. Я хочу взять случайную выборку из этого представления на основе ряда условий. Я понимаю, что это можно сделать следующим образом:

select * from viewname
where columnname = 'A'  -- the condition
order by columnname 
limit 5;

Однако вместо «предела 5» я хочу взять процент от числа строк, которые удовлетворяют этому условию. Так, например, «предел 5%» (хотя это не правильный синтаксис). Я понимаю, что подобное можно сделать с помощью предложения tableample, но это не относится к представлениям.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Чтобы случайным образом выбрать процент ваших строк, и если у вас Postgres 9,5 или выше, взгляните на Postgres TABLESAMPLE .

Имеется две опции: BERNOULLI и SYSTEM:

Каждый из методов выборки BERNOULLI и SYSTEM принимает один аргумент, представляющий собой долю таблицы в выборке, выраженную в процентах от 0 до 100. [...] Каждый из этих двух методов возвращает случайно выбранную выборку таблица, которая будет содержать приблизительно указанный процент строк таблицы.

SYSTEM быстрее, но BERNOULLI дает лучшее случайное распределение, поскольку каждая запись имеет одинаковую вероятность при выборе.

SELECT * 
FROM tablename TABLESAMPLE SYSTEM(5)
WHERE columnname = 'A'  -- the condition
ORDER BY columnname;

Примечание: это работает, только если вы запрашиваете таблицу, а не для представлений.

0 голосов
/ 11 января 2019

Вы можете использовать оконную функцию PERCENT_RANK

SELECT *
FROM 
(
  select *, PERCENT_RANK() OVER (PARTITION BY columnname ORDER BY random()) AS pcrnk
  from tablename
  where columnname = 'A'
) q
WHERE pcrnk <= 0.05

А если вы не хотите видеть этот pcrnk в результате?

SELECT (t).*
FROM 
(
  select t, PERCENT_RANK() OVER (PARTITION BY columnname ORDER BY random()) AS pcrnk
  from tablename t
  where columnname = 'A'
) q
WHERE pcrnk <= 0.05 

Тест по дБ <> скрипка здесь

Эти запросы будут извлекать 5% от того, что обычно получается на основе критериев columnname = 'A' F.E. если есть 100 'A' и 1000 'B', то они возвращают 5 записей.

Если вы хотите вернуть 5% всех записей в таблице? Тогда вот еще один трюк.

select *
from tablename
where columnname = 'A'
order by random()
limit 0.05 * (select count(*) from tablename)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...