2011-01-09 71 views
2

我需要按隨機順序選擇行並返回一個查詢,該查詢以正常順序和相反順序保存行。這是爲了模擬我正在研究的籃球比賽的幻想選秀。以隨機順序選擇行,然後將其顛倒

例如,我需要一個結果集如下:然後再以下四是按相反的順序

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

正如你所看到的,第一四支球隊是隨機的。 希望我設法解釋這個問題,如果不是的話 - 請評論,我會進一步解釋。

回答

2

你必須「緩存」隨機ORDER BY的結果。

在這段代碼中,如果引用UNION中的CTE,它將被評估兩次,您將有2個不同的順序。熱膨脹係數只是一個宏觀

;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語句中完成

1

你可以使用這樣的查詢:

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

這會從數據庫返回的前十名隨機團隊。然後你可以用一些代碼來反轉它。

+0

:)「一些代碼」是我正在尋找的實際... – Faruz 2011-01-09 16:10:13

+0

我認爲iraklis意味着你不會在SQL中這樣做,所以'一些代碼'將在您的程序中,其中您沒有提供該語言;) – Nanne 2011-01-09 16:14:41