我一直在搜索,似乎无法在任何地方找到答案,所以我正在寻求帮助。
我正在尝试随机选择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次并且投了票每次都有不同的条目。
答案 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);