SQL server Вывести любую операцию и предыдущую операцию по этому же объекту в одну строку
Автор: drug | Категория: Технические науки / Информатика | Просмотров: 1172 | Комментирии: 0 | 23-11-2015 08:31
 SQL server Вывести любую операцию и предыдущую операцию по этому же объекту в одну строку
 
в 1 подзапросе находим нашу операцию, с помощью 2 подзапроса находим данные по предыдущему запросу и в итоге к запросу с основной операцией (главному) подключаем данные по предыдущему запросу
 
declare @action_oper_id TIdentifier = 4814849
select top 1 
  action_oper_id             = ao.action_oper_id,
  equip_id                   = ae.equip_id,
  action_oper_type_name      = aot.action_oper_type_name,
  equip_model_name           = em.equip_model_name,
  dept_name                  = d.dept_name,
  action_oper_date           = ao.action_oper_date,
  facility_id                = a.facility_id, 
  action_oper_id_prev        = po.action_oper_id_prev, 
  action_oper_type_name_prev = po.action_oper_type_name_prev,      
  dept_name_prev             = po.dept_name_prev,
  action_oper_date_prev      = po.action_oper_date_prev,
  facility_id_prev           = po.facility_id_prev
from dbo.action_operation             as ao 
       join dbo.action_equipment      as ae on ae.action_oper_id = ao.action_oper_id
       join dbo.equipment_model       as em on em.equip_model_id = ae.equip_model_id
       join dbo.action_operation_type as aot on aot.action_oper_type_id = ao.action_oper_type_id
       join dbo.equipment             as e on e.equip_id = ae.equip_id 
       join dbo.dept                  as d on d.dept_id = e.dept_id
       join dbo.[action]              as a on a.action_id = ao.action_id
  left join (select top 1  
                equip_id                   = ae.equip_id,
                action_oper_id_prev        = ao.action_oper_id,
                action_oper_type_name_prev = aot.action_oper_type_name,      
                dept_name_prev             = d.dept_name,
                action_oper_date_prev      = ao.action_oper_date,
                facility_id_prev           = a.facility_id
              from dbo.action_operation           as ao 
                   join dbo.[action]              as a on a.action_id = ao.action_id
                   join dbo.action_equipment      as ae on ae.action_oper_id = ao.action_oper_id
                   join dbo.action_operation_type as aot on aot.action_oper_type_id = ao.action_oper_type_id
                   join dbo.equipment             as e on e.equip_id = ae.equip_id 
                   join dbo.dept                  as d on d.dept_id = e.dept_id
                   join (select
                           equip_id              = ae.equip_id,
                           action_oper_date      = ao.action_oper_date
                         from dbo.action_operation   as ao 
                           join dbo.action_equipment as ae on ae.action_oper_id = ao.action_oper_id
                         where ao.action_oper_id = @action_oper_id) as dd on dd.equip_id = ae.equip_id
              where ao.action_oper_date < dd.action_oper_date
              order by ao.action_oper_date desc) as po on po.equip_id = ae.equip_id 
where ao.action_oper_id = @action_oper_id
 
 
 
2 вариант 
 
select  
  action_oper_id             = ao.action_oper_id,
  equip_id                   = ae.equip_id,
  action_oper_type_name      = aot.action_oper_type_name,
  equip_model_name           = em.equip_model_name,
  dept_name                  = d.dept_name,
  action_oper_date           = ao.action_oper_date,
  facility_id                = a.facility_id,
  action_oper_type_prev      = aotp.action_oper_type_name,
  action_oper_date_prev      = aed.action_oper_date,
  dept_name_prev             = dp.dept_name
from dbo.action_operation           as ao 
     join dbo.action_equipment      as ae on ae.action_oper_id = ao.action_oper_id
     join dbo.equipment_model       as em on em.equip_model_id = ae.equip_model_id
     join dbo.action_operation_type as aot on aot.action_oper_type_id = ao.action_oper_type_id
     join dbo.equipment             as e on e.equip_id = ae.equip_id 
     join dbo.dept                  as d on d.dept_id = e.dept_id
     join dbo.[action]              as a on a.action_id = ao.action_id
left join (select 
             aem.equip_id,
             aom.action_oper_date,
             aom.action_oper_type_id
           from dbo.action_equipment as aem
             join dbo.action_operation as aom on aom.action_oper_id = aem.action_oper_id) as aed on aed.equip_id = ae.equip_id
                                                                                                and aed.action_oper_date =
                                                                 (select 
                                                                   action_oper_date_max = max(ao2.action_oper_date)
                                                                 from dbo.action_equipment as ae2
                                                                   join dbo.action_operation as ao2 on ao2.action_oper_id = ae2.action_oper_id
                                                                 where ae2.equip_id = aed.equip_id and ao2.action_oper_date < ao.action_oper_date)
left join dbo.equipment as ep on ep.equip_id = aed.equip_id
left join dbo.dept as dp on dp.dept_id = ep.dept_id
left join dbo.action_operation_type as aotp on aotp.action_oper_type_id = aed.action_oper_type_id
where ae.equip_id = 1146 
order by ao.action_oper_date desc 
Сочинения курсовыеСочинения курсовые