2014-02-27 111 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