Нужен запрос для использования в ssis, который возвращает 5 случайных результатов строки из другого запроса - PullRequest
0 голосов
/ 20 сентября 2019

Я новичок в SSIS и сложные операторы SQL.Я пытаюсь объединить свой запрос, который возвращает людей с датой за последний месяц, но затем взять эти результаты и получить 5 действительно случайных строк из этого.

Мой запрос до того, как я получу 5 случайных строк:

SELECT 
    DISTINCT
    isnull(dbo.fnRemovePatternFromString(p.Last_Name, '%[,-.'']%'), '')  as [Last]
    ,isnull(dbo.fnRemovePatternFromString(p.First_Name, '%[,-.'']%'), '') as [First]
    ,isnull(dbo.fnRemovePatternFromString(p.Middle_Initial, '%[,-.'']%'), '') as [Middle]
    ,isnull(pf.Date_on_staff, '') as [Date on Staff]
    ,pf.Status_from_date
FROM person p
inner JOIN person_facilities pf ON p.Person_ID = pf.Person_ID
LEFT JOIN usr_FacultyMember fm ON p.Person_ID = fm.person_id


WHERE 
    pf.FacCode in ('s', 'H', 'E')
and 
    (
      pf.Status_from_date >= (getdate()-31 ) 
      and pf.Status_from_date < getdate()
    )

Возвращает около 300 строк, но он будет меняться каждый месяц.

Исходя из этого результата, янужно получить 5 случайных строк из результатов.Это не может быть верхняя часть результатов или 5 строк в 1/5 результатов.Я хотел бы избежать создания представления для сохранения результатов в виде в этом примере .

Пример таблицы не похож на то, что мне нужно, так как это не случайно.

Я пытаюсь применить этот пример , поскольку он кажется случайным, но мне нужно контролировать количество строк в выводе. У этого есть аналогичный ответ.Эта часть мне нравится из этих двух примеров:

(abs(cast((binary_checksum(*) * rand()) as int)) % 100) <10

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

Я искал переменную для подсчета количества строк , но я не уверен, что я буду с ней делать или как я буду применять ее в моей строке ранда.

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

Любая помощь в решении этого сложного вопроса будет принята с благодарностью.

Обновление: этоотличается от случайное число на sql-без-использования-newid , потому что я не исключаю порядок с помощью newid, я просто пытаюсь найти случайные 5 возвращаемых строк.

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Может быть несколько логик для реализации некоторой рандомизации, которую я думал по модулю для столбца id / даты.

 SELECT 
        DISTINCT
        isnull(dbo.fnRemovePatternFromString(p.Last_Name, '%[,-.'']%'), '')  as [Last]
        ,isnull(dbo.fnRemovePatternFromString(p.First_Name, '%[,-.'']%'), '') as [First]
        ,isnull(dbo.fnRemovePatternFromString(p.Middle_Initial, '%[,-.'']%'), '') as [Middle]
        ,isnull(pf.Date_on_staff, '') as [Date on Staff]
        ,pf.Status_from_date
    FROM person p
    inner JOIN person_facilities pf ON p.Person_ID = pf.Person_ID
    LEFT JOIN usr_FacultyMember fm ON p.Person_ID = fm.person_id


    WHERE 
        pf.FacCode in ('s', 'H', 'E') order by MOD( sysdate-date,2 )
0 голосов
/ 20 сентября 2019

Почему бы просто не использовать top / fetch и order by newid()?

select top (5) t.*
from (<your query here>) t
order by newid();
...