2015-07-13 3 views
0

Я видел несколько таких вопросов, но ничего не ответил на то, что я ищу.Случайный выбор переменных в SQL

У меня есть 5000 строк данных более 3 лет. Каждая строка имеет memberID, поэтому члены ID повторяются и уникальны только для отдельного человека (но они повторятся в столбце, если человек находится в системе несколько раз в течение 3 лет).

Как я могу вытащить 100 случайных элементов-членов в течение 3 лет? (Так теоретически было бы более 100 строк, потому что члены ID могут повторять)

EDIT: Я должен уточнить, член ID является символом, а не числовым. Пример: W4564

ПРИМЕЧАНИЕ. Это НЕ ищет n строк, а не 100 различных идентификаторов в течение 3 лет, поэтому идентификатор может быть связан с 3 строками в результате. Результат будет иметь различное количество строк при каждом запуске SQL.

+1

возможно дубликат [Выбор п случайных строк из таблицы SQL Server] (http://stackoverflow.com/questions/848872/select-n-random-rows-from-sql -server-table) –

+0

Я думаю, что ответы предоставлены в стеке http: // overflow.com/questions/848872/select-n-random-rows-from-sql-server-table ссылка может уточнить вас для получения правильного ответа –

ответ

2

В зависимости от того, как индексируются ваши данные, вы можете просто захватить строки с помощью memberID из подзапроса. Например:

SELECT * 
FROM <yourtable> 
WHERE memberID IN (SELECT DISTINCT TOP 100 memberID FROM <yourtable>) 

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

SELECT * 
FROM <yourtable> 
WHERE memberID IN (SELECT DISTINCT TOP 100 memberID FROM <yourtable> ORDER BY newid()) 
+0

Так близко. Но это не получит 100 * отличных' значений 'memberId'. Подсказка: вам нужно что-то сделать, если в «топ-100» есть дубликаты. –

+0

Верно, я полагаю, что 'SELECT DISTINCT TOP 100' было бы более уместным :) –

+0

Но я бы хотел, чтобы разные, если идентификаторы разрешены для повторения (я хочу, чтобы все взаимодействия, связанные с идентификатором участника в течение 3-летнего периода) – Mere

0

Использование order by newid() вы можете использовать случайную сортировку. Используя where exists, вы можете выделить только те члены, для которых данные существуют за последние три года. Вам нужно сделать это на этом этапе, иначе вы можете случайно получить только членов, которые вообще не имеют никаких последних данных. Добавив top 100, вы можете выбрать только 100 строк из набора.

Комбинация должна получить 100 идентификаторов случайных членов, для которых имеются данные за последние три года:

select top 100 
    m.MemberID 
from 
    Member m 
where 
    exists (select 'x' 
      from MemberData d 
      where d.MemberId = m.MemberId 
       and d.DataDate > dateadd(year, -3, getdate())) 
order by 
    newid() 

Тогда вы могли бы использовать этот запрос в in пункте, чтобы получить данные из тех же таблиц MemberData, или любой другой стол по этому вопросу:

select 
    md.* 
from 
    MemberData md 
where 
    -- Same filter to get only the recent data 
    md.DataDate > dateadd(year, -3, getdate()) and 
    -- Only of 100 random members that have been active in the past 3 years. 
    md.MemberId in (
    select top 100 
     m.MemberID 
    from 
     Member m 
    where 
     exists (select 'x' 
       from MemberData d 
       where d.MemberId = m.MemberId 
        and d.DataDate > dateadd(year, -3, getdate())) 
    order by 
     newid() 
) 
+0

Вы проверили это? – GolezTrol