2016-07-07 3 views
1

Я пытаюсь вставить данные из исходной таблицы во временную таблицу с помощью функции NEWID(), чтобы получить (справедливый) случайный выбор строк из моего источника Таблица.SQL - Возвращение случайных строк из временной таблицы с помощью NEWID()

Глядя на код ниже, я ввожу данные мне нужно в временную таблицу #x и в точки 1 где я выбираю из #x, он возвращает данные в случайном порядке.

Однако в Поинте- ГДЕ Я сужая данные из #x (я аккумулировать линии до тех пор, некоторое количество не будет достигнуто) ВЫБОР больше не возвращает случайные строки - он возвращает строки в последовательном порядке от начала стол.

DROP TABLE IF EXISTS #x 
CREATE TABLE #x (Id INT, Commodity VARCHAR(3), Quantity FLOAT, RowNum INT, TotalQuantity FLOAT) 
INSERT INTO #x (id,commodity,quantity,rownum,totalquantity) 
    SELECT 
    i.id, i.commodity, i.quantity, ROW_NUMBER() OVER (ORDER BY i.id), SUM(i.quantity) OVER (ORDER BY i.id RANGE UNBOUNDED PRECEDING) 
    FROM inventory i 
    WHERE ......... 
     ......... 
    ORDER BY NEWID() 


SELECT * FROM #x -------- **POINT 1** 


DECLARE @y INT = (SELECT MIN(rownum) AS minrownum FROM #x WHERE totalquantity >= @tonnes) 


SELECT #x.id, #x.commodity, #x.quantity, #x.rownum, #x.totalquantity FROM #x 
WHERE #x.rownum <= @y 
ORDER BY NEWID()   -------- **POINT 2** 

Любые идеи о том, что мне не хватает?

Спасибо.

+0

Ваш запрос и вопрос сбивают с толку. Кажется, что часть вопроса требует случайного набора строк. Однако код генерирует первые N строк, которые добавляют к определенному значению. –

+0

Я немного смутил себя Гордон. То, что я пытаюсь сделать, - выбрать случайные строки из таблицы, пока не будет достигнуто определенное количество накоплений. – Johnathan

+0

FYI, Postgres 9.5 получил команду ['TABLESAMPLE'] (https://www.postgresql.org/docs/current/static/sql-select.html), чтобы почти случайным образом вытащить образец подмножества строк. Обсуждается в конце [этого ответа] (http://stackoverflow.com/a/8675160/642706) на аналогичный вопрос. –

ответ

1

LOL. Номер строки детерминирован. Там могут быть более эффективные способы сделать то, что вы хотите, но вы можете установить код выше по рандомизации строки номер:

ROW_NUMBER() OVER (ORDER BY newid()) 

Внешняя ORDER BY, вероятно, нет необходимости.

Ваш запрос, хотя и довольно запутанный. Он выбирает первые N строк (по id), которые суммируются до общей величины. Это имеет большой смысл. Я не уверен, для чего предназначена вся рандомизация.

EDIT:

Если вам нужно получить случайные строки, пока определенное число не будет достигнуто, то вы можете сделать:

SELECT i.* 
FROM (SELECT i.*, SUM(i.quantity) OVER (ORDER BY NEWID()) as cume_quantity 
     FROM inventory i 
     WHERE ......... 
      ......... 
    ) i 
WHERE cume_quantity - quantity < @tonnes; 

Вам не нужно временную таблицу. Вам не нужны дополнительные запросы.

+0

К сожалению, нужно выбрать случайные строки. Идентификаторы относятся к инвентаризации, и я не могу выдавать одинаковые номера каждый раз, когда выполняется запрос. – Johnathan

Смежные вопросы