Если логическое чтение - это проблема, я обычно начинаю фильтровать базовые таблицы (как упоминал Дэвид Браун). В вашем случае он будет работать как функция вместо представления, применяя предложение WHERE
внутри CTE.
Кроме того, я бы рекомендовал избегать самостоятельного объединения, вместо этого используйте функцию LEAD()
, ниже приведен тот же пример, с которого вы можете начать:
Declare @PersonID varchar(20) = 'YourData';
with timeline
as
(
select person, location, dateTime, d_base
from att.view_pD1
where person = @PersonID
union all
select person, location, dateTime_in, d_base
from att.view_rule
where person = @PersonID
union all
select person, location, dateTime_out, d_base
from att.view_rule
where person = @PersonID
)
select person,
location,
d_base,
dateTime as StartTime,
LEAD(dateTime) over (partition by person, location, d_base order by dateTime) EndTime
from timeline
go
или Чтобы получить крайнюю дату начала и окончания, вы можете начать со следующего:
Declare @PersonID varchar(20) = 'YourData';
select m.person,
m.location,
m.d_base,
s.datetime as StartTime,
e.datetime as EndTime
from att.<viewMasterData> as M
LEFT JOIN
(select person, location, datetime, d_base,
ROW_NUMBER () OVER (Partition by person, location, d_base order by datetime) as StartRN
from att.view_rule
where person = @PersonID
) as s ON M.person = s.person and m.location = s.location and m.base = s.base
LEFT JOIN
(select person, location, datetime, d_base,
ROW_NUMBER () OVER (Partition by person, location, d_base order by datetime desc) as EndRN
from att.view_rule
where person = @PersonID
) as e ON M.person = e.person and m.location = e.location and m.base = e.base
where s.StartRN = 1 and e.EndRN = 1