Выбор 1% выборки в Aginity Workbench SQL - PullRequest
1 голос
/ 08 марта 2019

Мне нужно отобрать случайную выборку из 1% записей в таблице (количество строк увеличивается каждую секунду).

Моя идея состоит в том, чтобы

SELECT DISTINCT
   random(),
   name,
   age,
   registrationNumber
FROM everGrowingTable
ORDER BY random desc
LIMIT (
    (select count(*) from everGrowingTable) * 0.01
) -- this is attempting to get 1%

Компилятор жалуется на оператор *.Вполне нормально, когда я жестко кодирую размер таблицы.

Я пробовал Документация IBM , но это говорит о вычислениях с использованием известных значений, а не значений, которые растут (так обстоит дело в случаемоя таблица)

Кажется, что нет функции Aginity SQL, которая делает это.Я заметил функцию MINUS в IntelliSense Aginity Workbench, но, увы, нет эквивалента умножения.

1 Ответ

1 голос
/ 08 марта 2019

Вы можете использовать оконные функции в подзапросе, чтобы назначить случайное число для каждой записи и вычислить общее количество записей, а затем выполнить фильтрацию во внешнем запросе:

SELECT name, age, registrationNumber
FROM (
    SELECT 
        name, 
        age, 
        registrationNumber,
        ROW_NUMBER() OVER(ORDER BY random()) rn,
        COUNT(*) OVER() cnt 
    FROM everGrowingTable
) x 
WHERE rn <= cnt / 100
ORDER BY rn
...