Разрешить службе взаимодействовать с рабочим столом в Windows

Один из способов, которым я нахожу очень хорошо, если есть автогенерированный идентификатор, заключается в использовании оператора modulo «%». Например, если вам нужно 10 000 случайных записей из 70 000, вы можете упростить это, сказав, что вам нужно 1 из каждых 7 строк. Это может быть упрощено в этом запросе:

SELECT * FROM 
    table 
WHERE 
    id % 
    FLOOR(
        (SELECT count(1) FROM table) 
        / 10000
    ) = 0;

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

SELECT * FROM 
    table 
WHERE 
    id % 
    FLOOR(
        (SELECT count(1) FROM table) 
        / 10000
    ) = 0
LIMIT 10000;

Это требует полного сканирования, но оно быстрее, чем ORDER BY RAND, и, на мой взгляд, проще понять, чем другие варианты, упомянутые в этот поток. Кроме того, если система, которая записывает в БД, создает множество рядов в партиях, вы не можете получить такой случайный результат, как ожидаете.

13
задан Palec 11 December 2016 в 19:39
поделиться