2014-02-27 200 views
3

我已經搜遍了,似乎無法找到任何地方的答案,所以我尋求幫助。限制記錄在隨機選擇

我想隨機選擇5個人。有點像繪畫。每個人都可以進入他們想要進入的多次,但只有其中的3個可以考慮。所以...... 5個不同的人會獲勝,但是所有參賽作品(包括參賽作品)都需要考慮多達3個參賽作品。

例如:

Adam,1 
Adam,2 
Adam,1 
Adam,1 
Sally,2 
Timmy,3 
John,1 
John,1 
Jenny,2 
Wendy,3 
Wendy,3 
Wendy,3 
Wendy,5 
Wendy,5 

這裏是到目前爲止,我已經得到了代碼:

select top 5 
    name, vote 
from 
    (SELECT 
     name, vote 
    FROM 
     Entries 
    GROUP BY 
      name, vote) winners 
ORDER BY 
    NEWID(); 

我的問題是:(1)我不限制他們3%考慮,因爲我(2)差異不起作用,因爲他們可以進入100次,並且每次都在不同的條目上進行投票。

+1

什麼是「投票」代表? –

+0

對於有多個用戶記錄的人的問題,沒有解決方案。你可以從事預防工作,但這會減少問題的範圍。 –

+1

您使用的是哪個版本的SQL Server? –

回答

1

試試這個。每個名稱最多隻能包含三個條目。

WITH UpToThree AS 
(
    SELECT 
     Name 
     ,RN = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Vote) 
     ,NEWID() as RandID 
    FROM 
     Entries 
) 
SELECT TOP 5 
    Name, MAX(RandID) 
FROM 
    UpToThree 
WHERE 
    RN < 4 
GROUP BY 
    Name 
ORDER BY 
    MAX(RandID) 
+0

但是這會影響選手的選票 - 在Wendy的情況下,她的「5」票不會被視爲她的前三票是「3」。 – user2864740

+0

這不會阻止多次選擇同一個人。 –

+0

@ user2864740我沒有得到這是投票欄中的投票計數。如果是這樣,那麼這個表格還有其他問題... – JNK

0

我看到一個挑戰,那就是確保有3個參賽者的人比有1個參賽者的可能性高3倍。我假設votes不重要,因爲它沒有在問題或評論中提及。

該策略是首先限制條目爲每人3隨機使用row_number()(和where)。然後,再次命令結果並隨機使用row_number()列舉每行。通過隨機列舉,任何條目在頂部都有相同的變化 - 所以具有3個條目的人的三次可能性與具有一個條目的人一樣最好。

最後,選擇第一個五人在此基礎上的序列號:

with entries_3 as (
     select e.* 
     from (select e.*, row_number() over (partition by name order by newid()) as seqnum 
      from entries 
      ) e 
     where seqnum <= 3 
    ), 
    entries_3_ordered (
     select e.*, row_number() over (order by newid()) as seqnum2 
     from entries_3 
    ) 
select top 5 name, votes 
from from entries_3_ordered 
group by name, votes 
order by min(seqnum2); 
1

我不知道如果有以下的是SQL 2000不可用:

SELECT TOP 5 Name 
FROM (SELECT Name,ABS(CHECKSUM(NEWID())) nid, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY NEWID()) RN 
     FROM Table1) as sub 
WHERE RN <= 3 
GROUP BY Name 
ORDER BY MAX(nid) 

演示:SQL Fiddle

我不知道你想如何決定你想要顯示哪個投票,但是如果你想要顯示的話,應該在一個單獨的連接到勝者列表中處理。試圖單憑姓名來考慮。

+0

是的...我得到'ROW_NUMBER'不是一個可識別的函數名稱。我看到我可以對臨時表執行同樣的操作。我會調查。這可能不是一個可能的查詢。感謝大家的幫助! – KylieM