Выберите Верхние строки и Упорядочить по NEWID () в DB2.

В SQL Server у меня есть этот запрос

SELECT TOP 10 * 
FROM xTable
ORDER BY NEWID()

который в основном возвращает 10 случайных строк. У меня также есть верхние строки, параметризованные числом, но это не проблема

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

Если бы я смог добиться этого непосредственно в DB2, это было бы замечательно, так как мне нужно получить более тысячи строк.


person Jackal    schedule 19.07.2019    source источник
comment
Или этот обман: stackoverflow.com/questions/19412/ ВЫБРАТЬ столбец, RAND () как IDX FROM таблицы ORDER BY IDX ВЫБРАТЬ ТОЛЬКО ПЕРВЫЕ 10 СТРОК   -  person smoore4    schedule 19.07.2019
comment
это действительно сработало   -  person Jackal    schedule 19.07.2019
comment
Возможный дубликат Как запросить случайную строку в SQL?   -  person mustaccio    schedule 19.07.2019


Ответы (2)


Упорядочивание - не лучшая идея, особенно для больших таблиц.
У нас есть возможность использовать встроенную функцию Db2 for LUW subselect - tableample-clause.

БЕРНУЛЛИ

Выборка BERNOULLI рассматривает каждую строку отдельно. Он включает каждую строку в выборке с вероятностью P / 100 (где P - значение числового выражения1) и исключает каждую строку с вероятностью 1 - P / 100, независимо от других строк. Таким образом, если числовое выражение1 оценивается как значение 10, представляющее десятипроцентную выборку, каждая строка будет включена с вероятностью 0,1 и исключена с вероятностью 0,9.

СИСТЕМА

Системная выборка позволяет менеджеру базы данных определить наиболее эффективный способ ее выполнения. В большинстве случаев выборка SYSTEM, примененная к имени таблицы, означает, что каждая страница имени таблицы включается в выборку с вероятностью P / 100 и исключается с вероятностью 1 - P / 100. Все строки на каждой включенной странице подходят для выборки.

Пример:

SELECT * 
FROM MYTABLE TABLESAMPLE SYSTEM (0.1) 
FETCH FIRST 10 ROWS ONLY;

Этой функции нет в DB2 для IBM i / iSeries / OS400. Вместо этого используйте предложение order by rand() fetch first 10 rows для этой платформы.

person Mark Barinstein    schedule 20.07.2019
comment
Мне пришлось сделать заказ, потому что одно из моих требований - получать разные строки x, не дублирующиеся каждый раз, когда я запрашиваю его, по крайней мере, как я это делал в sql, но теперь я пытаюсь сделать это, используя динамический sql внутри открытого запроса, поэтому я может просто запросить эти X строк вместо получения всех данных. Однако это полезно знать, поскольку никто из моих коллег не знаком с функциями DB2, кроме простого динамического sql для получения необработанных данных. - person Jackal; 20.07.2019
comment
Также просто интересно, так как я не могу проверить это, потому что у меня не установлена ​​DB2, и я сейчас не в офисе. Применяется ли рандомизация после или до ограничения размера строки? - person Jackal; 21.07.2019
comment
Конечно, рандомизация применяется перед ограничением. - person Mark Barinstein; 21.07.2019
comment
Интересно, думаю, я попробую это завтра вместо rand (), наверняка будет большая разница в производительности. Огромное спасибо - person Jackal; 21.07.2019
comment
Я просто попытался использовать это и не распознает систему по открытому запросу SELECT * FROM OPENQUERY(linkedServer, 'SELECT * FROM myTable TABLESAMPLE SYSTEM (0.1)') Поставщик - IBMDA400, не уверен, что это повлияет на - person Jackal; 22.07.2019
comment
Я забыл добавить, похоже, что это DB2 AS400, который я искал, а tableample предназначен для LUW - person Jackal; 22.07.2019
comment
Приведенный мной пример не применим к DB2 для IBM i. Я добавил к вашему вопросу соответствующий тег. - person Mark Barinstein; 22.07.2019
comment
Я вижу, есть ли что-нибудь подобное в 400 или просто используйте rand (), как многие примеры, которые я видел? - person Jackal; 22.07.2019

Это DB2 LUW или AS400?

пытаться

SELECT *
  FROM xTable
  ORDER BY ROW_NUMBER()
  FETCH FIRST 10 ROWS ONLY;
person GenericDisplayName    schedule 19.07.2019
comment
Обратите внимание, что это ** не будет случайным ** - запрос будет проходить по таблице в некотором неопределенном порядке (вероятно, сама базовая таблица) и возвращать числа на основе этого порядка. Последующие запуски вероятны, хотя и не гарантированы, чтобы возвращать одни и те же строки каждый раз при выполнении запроса, что почти наверняка нежелательно. - person Clockwork-Muse; 19.07.2019