В SQL как я могу использовать один запрос для установки переменных для выполнения дополнительных запросов (Access Control People Proximity COVID-19) - PullRequest
0 голосов
/ 20 апреля 2020

Мне нужно создать отчет для SQL Server Reporting Services (SSRS), где пользователь может предоставить имена и диапазоны дат сотрудников, и он вернет не только активность сотрудников между этими датами, но и других сотрудников внутри временной диапазон до и после них. Это используется для отслеживания потенциальных случаев и выяснения того, кто еще мог вступить в контакт с этим человеком. Я могу заставить эти две отдельные части работать, но я не могу найти способ перебрать результаты.

Переменные, которые будут установлены пользователями:

@Person varchar(max)
@Begin datetime2
@End datetime2

Запрос 1:

SELECT Admitted,
Time,
Person,
Door
FROM DoorJournal
WHERE Person like @Person
AND Time BETWEEN @Begin AND @End

Из запроса 1 я хочу открыть дверь и время доступа человека и передать его на следующий запрос

@Door varchar(max) 
@Entry datetime2

Запрос 2:

SELECT Admitted,
Time,
Person,
Door
FROM DoorJournal
WHERE Door like @Door
AND Time BETWEEN (DateAdd(minute,-2,@Entry) AND (DateAdd(minute,15,@Entry)

Затем я хочу объединить эти результаты, чтобы мы получили представление, подобное этому

Admitted     Time    Door    Person
Yes          9:05    Door 1  Person 1
Yes          9:06    Door 1  Person 2
Yes          9:07    Door 1  Query 1 Person
Yes          9:10    Door 1  Person 3
Yes          10:15   Door 2  Person 5
Yes          10:16   Door 2  Query 1 Person
Yes          10:21   Door 2  Person 4

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

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

SELECT Admitted,
Time,
Person,
Door
FROM (SELECT Admitted,
Time,
Person,
Door
FROM DoorJournal
WHERE Person like @Person
AND Time BETWEEN @Begin AND @End) AS P
WHERE Door IN (P.Door)
AND Time BETWEEN (DateAdd(minute,-2,P.Time) AND (DateAdd(minute,15,P.Time)

Добавление решения на основе предложения Алана:

Select Time, Door
INTO #specific
WHERE Person like @Person
AND Time BETWEEN @Begin AND @End

SELECT Admitted,
Time,
D.Person,
Door
FROM DoorJournal D
INNER JOIN #specific s ON D.Person = S.Person
WHERE D.Door = S.Door
AND D.Time BETWEEN (DateAdd(minute,-2,S.Time) AND (DateAdd(minute,15,S.Time)

1 Ответ

1 голос
/ 20 апреля 2020

Я думаю, что это сделает это. Я сделал это без тестирования, поэтому не могу гарантировать, что это на 100% правильно, и у меня нет времени на создание образцов данных ...

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

-- Get specified persons door activity
-- dump it into a temp table
SELECT Admitted,
Time,
Person,
Door
INTO #specific
FROM DoorJournal
WHERE Person = @Person
AND Time BETWEEN @Begin AND @End

-- get activity from all people at the same doors, extending the time range
-- we include the original person here so we only have to query this one table at the end.
SELECT Admitted,
Time,
Person,
Door
INTO #others
FROM DoorJournal dj
    JOIN (SELECT DISTINCT Door from #specific) s ON dj.Door = d.Door
WHERE Time BETWEEN DateAdd(minute,-2,@Entry) AND DateAdd(minute,15,@Entry)

-- Join the 2 together and get the results
SELECT 
    ot.*
    FROM #specific sp 
        JOIN #others ot ON sp.Door = ot.Door
    ORDER BY ot.Time, ot.Door, ot.Person
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...