Как случайным образом выбирать отдельные данные из БД? [Дубликат]

Другой способ сделать это - передать управляемую строку (экземпляр StringBuilder) через P / Invoke (в качестве параметра вашей функции Run ).

Таким образом никакие выделения не выполняются на неуправляемой стороне.

Другими словами, у вас будет что-то вроде:

  extern «C» __declspec (dllexport) void __cdecl Run (char *  data) {// заполнить массив данными // no return value (void)}  

и вызвать его следующим образом:

  [DllImport ("  Unmanaged.dll ", CharSet = CharSet.Ansi)] static extern void Run (результат StringBuilder);  Результат StringBuilder = новый StringBuilder (100);  Выполнить (результат);   
47
задан Bhadra 26 March 2012 в 08:50
поделиться

5 ответов

SELECT *
FROM   (
    SELECT *
    FROM   table
    ORDER BY DBMS_RANDOM.VALUE)
WHERE  rownum < 21;
77
ответ дан tjati 16 August 2018 в 02:14
поделиться
  • 1
    Разве это не должно быть DBMS_RANDOM.VALUE? – Filburt 26 March 2012 в 09:01
  • 2
    Побей меня. Это, однако, будет выбирать только первые 20 строк из таблицы и упорядочивать их случайным образом. – Nishant Sharma 26 March 2012 в 09:02
  • 3
    Вы должны знать, что это очень тяжелая операция на больших таблицах, потому что сначала будет назначать случайное число для КАЖДОЙ строки, а затем сортировать по этому значению, а затем брать с нее некоторые записи. – rvheddeg 4 August 2015 в 07:53
  • 4
    @NishantSharma, строки рандомизированы, then limited - ваш комментарий неверен. – Simon MᶜKenzie 27 January 2017 в 00:43
  • 5
    Этот подход ОЧЕНЬ медленный – Evan Kroske 8 December 2017 в 21:55
SELECT column FROM
( SELECT column, dbms_random.value FROM table ORDER BY 2 )
where rownum <= 20;
6
ответ дан Bishan 16 August 2018 в 02:14
поделиться
SELECT * FROM table SAMPLE(10) WHERE ROWNUM <= 20;

Это более эффективно, так как не нужно сортировать таблицу.

9
ответ дан grokster 16 August 2018 в 02:14
поделиться
  • 1
    Остановка образца после 20 строк приведет к неслучайным результатам (строки, найденные ранее в таблице, будут возвращаться гораздо чаще, чем более поздние). Кроме того, это не гарантирует возврата 20 строк. – Jeffrey Kemp 18 June 2015 в 03:01

SAMPLE () не гарантирует , чтобы дать вам ровно 20 строк, но может быть подходящим (и может выполнять значительно лучше, чем полный запрос + сортировать по случайному для больших таблиц):

SELECT *
FROM   table SAMPLE(20);

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

31
ответ дан Jeromy French 16 August 2018 в 02:14
поделиться
  • 1
    образец быстрый, но не кажется очень случайным. записи к началу / началу таблицы, как правило, предпочтительнее. – craigrs84 28 July 2014 в 21:26
  • 2
    это произойдет, если вы остановите запрос, прежде чем он пройдет через всю таблицу. – Jeffrey Kemp 28 July 2014 в 23:55
  • 3
    Извините, я сделал ошибку, ваш пост в порядке, и результаты одинаково распределены. Это когда вы добавляете & quot ;, где rownum & lt; = 20 & quot; в сочетании с образцом (20), что данные начинают становиться менее случайными. – craigrs84 29 July 2014 в 18:21
  • 4
    Он отлично работает для меня! Спасибо! – Javier Muñoz 21 November 2017 в 18:02

Чтобы случайным образом выбрать 20 строк, я думаю, вам лучше выбрать, сколько из них будет упорядочено и выбрать первые 20 из этого набора.

Что-то вроде:

Select *
  from (select *
          from table
         order by dbms_random.value) -- you can also use DBMS_RANDOM.RANDOM
 where rownum < 21;

Лучше всего использовать для небольших таблиц, чтобы избежать выбора больших фрагментов данных, чтобы отбросить большинство из них.

3
ответ дан Nishant Sharma 16 August 2018 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: