2011-01-09 13 views
2

ランダムな順序で行を選択し、その行を通常の順序と逆の順序で保持するクエリを返す必要があります。これは私が取り組んでいるバスケットボールゲームのファンタジードラフトをシミュレートするために行われます。そして、その後、4は逆の順序であり、以下のあなたが見ることができるようにランダムな順序で行を選択してからそれを逆にする

team1 1 
team2 2 
team6 3 
team9 4 
team9 5 
team6 6 
team2 7 
team1 8 

は、最初の4つのチームがランダムである:

は例えば、私は以下のように結果セットを必要とします。 私は問題を説明することができたと思っています。もしそうでなければ、コメントしてください。

答えて

2

ランダムORDER BYの結果を「キャッシュ」する必要があります。

このコードでは、UNIONでCTEを参照すると2回評価され、2つの異なる注文があります。 CTEは、行だけを複製するマクロ

;WITH cList AS 
(
SELECT team, ROW_NUMBER() OVER (ORDER BY NEWID()) AS rn 
FROM teams 
) 
SELECT * INTO #tempresults FROM cList WHERE rn <= @rn --or however many 

SELECT *, rn FROM #tempresults 
UNION ALL 
SELECT *, (2 * @rn) - rn FROM #tempresults 
ORDER BY rn 

は(like this)ダミークロスが参加して簡単ですが、これは注文し、中間結果の上にあまりにもrownumbering必要です。私はそれが単一のSQLステートメントで行われるとは思わない

+0

私はより良い解決策を見つけることができないと思うので、私はそれを受け入れるだろう... – Faruz

1

あなたは、このようなクエリを使用することができます。

select top(10) teamname, NewId() as Random 
from teams 
order by Random 

これは、データベースからの上位10ランダムチームを返します。次に、コードを使用してそれを元に戻すことができます。

+0

:) "いくつかのコード"は私が実際に探していたものでした... – Faruz

+0

私はiraklisはあなたがSQLでそれをしないことを意味すると思いますあなたのプログラムには、あなたがその言語を提供しなかった「いくつかのコード」があります); – Nanne

+0

申し訳ありません。私のプログラムは完全にSQLベースです。だから私は外部の干渉なしで要求通りに行を返す必要があります。それにもかかわらず、あなたが努力してくれたことに感謝します。 – Faruz

関連する問題