Как выбрать определенное количество случайных записей, где один столбец уникален? - PullRequest
0 голосов
/ 19 января 2009

Сегодня я боролся с этим одним требованием SQL-запроса, и мне было интересно, может ли кто-нибудь мне помочь.

У меня есть таблица спортивных вопросов. Один из столбцов - команда, связанная с вопросом. Мое требование - вернуть определенное количество случайных вопросов, где команды уникальны.

Итак, допустим, у нас есть следующая таблица и мы хотим 5 вопросов:

Question        Answer        Team
-----------------------------------
question 1      answer 1      team A
question 2      answer 2      team B
question 3      answer 3      team B
question 4      answer 3      team D
question 5      answer 3      team A
question 6      answer 3      team C
question 7      answer 3      team F
question 8      answer 3      team C
question 9      answer 3      team G
question 10     answer 3      team D

Верный результат вернет:

question 1      answer 1      team A
question 2      answer 2      team B
question 4      answer 3      team D
question 6      answer 3      team C
question 7      answer 3      team F

Я чувствую, что это можно сделать как чистый SQL-оператор с некоторым умным использованием Distinct и Take, но я пока не смог сделать это правильно.

Лучшее решение до сих пор от Младен Прайдик . Я только что немного обновил его, чтобы улучшить его случайность:

SELECT TOP 10 * 
FROM    (SELECT ROW_NUMBER() OVER(PARTITION BY Team ORDER BY Team, NEWID()) AS RN, *
    FROM Question
    ) teams
WHERE   RN = 2
ORDER BY NEWID()

Ответы [ 3 ]

2 голосов
/ 19 января 2009

для sql 2005 вы можете сделать это:

select top 5 * 
from    (
            select ROW_NUMBER() over(partition by team order by team) as RN, *
            from @t 
        ) t
where RN = 1
order by NEWID()
1 голос
/ 19 января 2009

Это должно делать то, что вам нужно, в оракуле; очевидно, что для другой базы данных вам нужно использовать источник случайных чисел. Там, вероятно, лучший способ; будем надеяться, что кто-то еще укажет нам на это: p

select question, answer, team
from
(
select question, answer, team, r
from
(
select 
    question, 
    answer, 
    team,
    rank() over (partition by team order by dbms_random.value) r 
from questions
)
where r = 1
order by dbms_random.value
) where rownum<=5;

Тестовый код:

create table questions(question varchar2(16), answer varchar2(16), team varchar2(16));

insert into questions(question, answer, team)
values ('question 1',      'answer 1',      'team A');

insert into questions(question, answer, team)
values ('question 2',      'answer 2',      'team B');

insert into questions(question, answer, team)
values ('question 3',      'answer 3',      'team B');

insert into questions(question, answer, team)
values ('question 4',      'answer 3',      'team D');

insert into questions(question, answer, team)
values ('question 5',      'answer 3',      'team A');

insert into questions(question, answer, team)
values ('question 6',      'answer 3',      'team C');

insert into questions(question, answer, team)
values ('question 7',      'answer 3',      'team F');

insert into questions(question, answer, team)
values ('question 8',      'answer 3',      'team C');

insert into questions(question, answer, team)
values ('question 9',      'answer 3',      'team G');

insert into questions(question, answer, team)
values ('question 10',    'answer 3',      'team D');

commit;
0 голосов
/ 19 января 2009

В PostgreSQL (который имеет отличные от), я бы, вероятно, сделал что-то вроде этого:

select distinct on (Team) Question, Answer, Team from test order by Team, random() limit 5;

только что проверил. Кажется, работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...