2015-08-14 68 views
1

我試圖選擇隨機存儲在一個表中的每個Id的行數很少,其中這些id在此表上有多行。這是很難用言語來解釋,所以讓我給你一個例子:在同一個表中隨機選擇幾行(T-SQL)

Id Review 
1 Text11 
1 Text12 
1 Text13 
2 Text21 
3 Text31 
3 Text32 
4 Text41 
5 Text51 
6 Text61 
6 Text62 
6 Text63 

結果預計:

Id Review 
1 Text11 
1 Text13 
2 Text21 
3 Text32 
4 Text41 
5 Text51 
6 Text62 

事實上,表中包含成千上萬的從表

例行。一些ID僅包含一個Review,但其他一些可以包含數百個評論。我想選擇其中的10%,並至少選擇一次,所有行都有1-9條評論(我看到SELECT TOP 10 percent FROM table ORDER BY NEWID()包括該行,即使它是獨自一人) 我讀了一些Stack主題,我想我必須使用一個子查詢,但我沒有找到正確的解決方案。

提前致謝。

問候。

+0

每個ID隨機評論? – Backs

+0

如果您只需要每個ID的10%的行,爲什麼您的預期結果中有2行ID爲1? –

+0

例如:對於有100多個評論的ID,隨機選擇10%。而對於<10條評論的Ids,隨機選擇10%(實際上1排) – Rhyzko

回答

1

試試這個:

DECLARE @t table(Id int, Review char(6)) 
INSERT @t values 
(1,'Text11'), 
(1,'Text12'), 
(1,'Text13'), 
(2,'Text21'), 
(3,'Text31'), 
(3,'Text32'), 
(4,'Text41'), 
(5,'Text51'), 
(6,'Text61'), 
(6,'Text62'), 
(6,'Text63') 

;WITH CTE AS 
(
SELECT 
    id, Review, 
    row_number() over (partition by id order by newid()) rn, 
    count(*) over (partition by id) cnt 
    FROM @t 
) 
SELECT id, Review 
FROM CTE 
WHERE rn <= (cnt/10) + 1 

結果(隨機):

id Review 
1 Text12 
2 Text21 
3 Text31 
4 Text41 
5 Text51 
6 Text63 
+0

您好T-Clausen,我已經嘗試了更有意義的表格,它似乎確定:)非常感謝。 – Rhyzko