2014-02-27 4 views
3

Я искал все и не могу найти ответ на все это, поэтому я прошу помощи.Ограничительные записи в случайном порядке

Я пытаюсь случайным образом выбрать 5 человек. Вид как рисунок. Каждый может вводить себя, сколько раз они хотят войти, но только три из этих записей могут быть рассмотрены. Итак ... 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 на для рассмотрения дела I (2) Distinct не работает, потому что они могут входить в себя 100 раз и каждый раз проголосовали за другую запись.

+1

Что такое 'vote'? –

+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

Но это будет предубеждать голоса участников. В случае с Венди ее «5» голосов не будут считаться, поскольку ее первые три голоса были «3». – user2864740

+0

Это не означает, что один и тот же человек выбирается несколько раз. –

+0

@ user2864740 Я не понял, что это подсчет голосов в колонке голосования. Если это то, то эта таблица имеет другие проблемы ... – JNK

0

Я вижу вызов в обеспечении того, чтобы люди с 3 входами в 3 раза чаще выигрывали, чем люди с 1 записью. Я предполагаю, что votes не имеет значения, потому что он не упоминается в вопросе или комментариях.

Стратегия состоит в том, чтобы сначала ограничить записи до 3 на человека случайным образом, используя row_number()where). Затем закажите результаты снова и перечислите каждую строку, используя row_number() случайным образом. Перечисляя случайным образом, любая запись имеет равное изменение бытия наверху - поэтому человек с тремя записями имеет в три раза вероятность быть лучшим, как человек с одной записью.

Наконец, выберите первые пять человек, на основе этой последовательности номер:

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) 

Demo: SQL Fiddle

Я не уверен, как вы хотите решить, какой голос вы хотите отобразить, но это должно быть обработано в отдельном объединении в список победителей, если вы хотите, чтобы en пытается считаться только по имени.

+0

Да ... Я получаю 'ROW_NUMBER' не признанное имя функции. Я вижу, что могу сделать то же самое с временными таблицами. Я буду исследовать. Это просто не может быть возможным для записи. Спасибо всем за помощь! – KylieM

Смежные вопросы