2016-07-07 21 views
1

Ich versuche, Daten aus einer Quelltabelle in eine temporäre Tabelle mit der Funktion NEWID() einfügen, so dass ich eine (ziemlich) zufällige Auswahl von Zeilen aus meiner Quelle Tabelle.SQL - Rückgabe zufällige Zeilen aus einer temporären Tabelle mit NEWID()

unter dem unten genannten Code Sehen, ich die Daten, die ich in die temporären Tabelle muß einfügen #x und Punkt 1, wo ich von #x wählen, es gibt die Daten in einer zufälligen Reihenfolge.

jedoch bei Punkt 2, wo ich die Daten von #x bin Eingrenzung (I akkumulieren Linien, bis eine bestimmte Menge erreicht wird) die SELECT nicht mehr zufällige Zeilen zurückgibt - es gibt Zeilen in einer bestimmten Reihenfolge vom Beginn der Der Tisch.

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** 

Irgendwelche Ideen zu was ich vermisse?

Danke.

+0

Ihre Anfrage und Ihre Frage sind verwirrend. Ein Teil der Frage scheint eine zufällige Reihe von Zeilen zu haben. Der Code generiert jedoch die ersten N Zeilen, die zu einem bestimmten Wert hinzufügen. –

+0

Ich bin ein bisschen verwirrt Gordon. Ich versuche willkürliche Zeilen aus einer Tabelle auszuwählen, bis eine bestimmte kumulative Menge erreicht ist. – Johnathan

+0

FYI, Postgres 9.5 hat den Befehl ['TABLESAMPLE'] (https://www.postgresql.org/docs/current/static/sql-select.html) erhalten, um fast zufällig eine Stichprobe von Teilmengen der Zeilen zu ziehen. Diskutiert am Ende dieser [http://stackoverflow.com/a/8675160/642706] ähnliche Frage. –

Antwort

1

LOL. Ihre Zeilennummer ist deterministisch. Möglicherweise gibt es bessere Möglichkeiten zu tun, was Sie wollen, aber Sie können den obigen Code beheben, indem die Zeilennummer Randomisierung:

ROW_NUMBER() OVER (ORDER BY newid()) 

Der äußere ORDER BY ist wahrscheinlich nicht notwendig.

Ihre Abfrage ist jedoch ziemlich verwirrend. Es wählt die ersten N Zeilen (nach ID) aus, die sich zur Gesamtmenge addieren. Das macht sehr viel Sinn. Ich bin mir nicht sicher, wofür die Randomisierung eigentlich ist.

EDIT:

Wenn Sie zufällige Zeilen erhalten, bis eine bestimmte Anzahl erreicht ist, können Sie tun:

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; 

Sie brauchen nicht eine temporäre Tabelle. Sie benötigen keine zusätzlichen Abfragen.

+0

Es muss leider zufällige Zeilen auswählen. Die IDs beziehen sich auf Inventar und ich kann nicht jedes Mal die gleichen Nummern ausgeben, wenn die Abfrage ausgeführt wird. – Johnathan