限制随机选择中的记录

时间:2014-02-27 18:04:52

标签: sql sql-server tsql sql-server-2000

我一直在搜索,似乎无法在任何地方找到答案,所以我正在寻求帮助。

我正在尝试随机选择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次并且投了票每次都有不同的条目。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

我不确定您希望如何决定要显示哪个投票,但是如果您希望仅根据名称来考虑这些条目,则应该在单独的连接中处理获胜者列表。

答案 2 :(得分:0)

我认为确保3名参赛者的胜率是1次参赛人数的3倍。我假设votes并不重要,因为在问题或评论中没有提到它。

策略是首先使用row_number()(和where)随机将条目限制为每人3个。然后,再次对结果进行排序,并随机使用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);