2016-07-07 2 views
1

NEWID()を使用して一時テーブルからランダムに行を返します表。以下のコードを見てみるとSQL - 私は私のソースからのラインの(かなり)ランダムな選択を得るように<code>NEWID()</code>機能を使用して一時テーブルにソーステーブルからデータを挿入しようとしています

が、私は一時テーブル#xに私は必要なデータを挿入して、私は#xから選択ポイント1で、それがランダムな順序でデータを返します。

しかし、ポイントIは#xからデータを絞り込む午前2でSELECTがもはやランダム行を返す(Iは一定量に到達するまでの行を蓄積する) - これは、先頭から順に行を返しますテーブル。

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

残念ながらランダムな行を選択する必要があります。 IDは在庫に関連しており、クエリが実行されるたびに同じ番号を提供することはできません。 – Johnathan

関連する問題