2016-05-31 3 views
0

Я хочу объединить строки на Внутри и Местоположение база. Я хочу проверить, сколько времени остается в определенном месте. Внутри среднее транспортное средство вводится в определенном месте и означает, что вы покинули определенное место. Если автомобиль вводит и покидает такое же место в определенную дату, то TimeLast будет рассчитать. например HD и BP - это место, где транспортные средства входят и уходят.Как динамически объединить строки в базе состояния

select zs.oId,o.Number,z.Id,z.Location,zs.TimeFirst,zs.inside from zs join 
z on zs.Id = z.Id join 
o on zs.oId=o.oId 
where z.GroupId in (1094,1095,1096) and CONVERT(Date,TimeFirst)='2016/5/29' 
order by zs.oId,zs.TimeFirst 

Выход

oId Number Id  Location   TimeFirst    Inside 
1639 0664 1  Hd  2016-05-29 05:48    0 
1639 0664 2  Kp  2016-05-29 18:46    1 
1640 0359 1  Hd  2016-05-29 13:12    0 
1640 0359 1  Hd  2016-05-29 13:42    1 
1640 0359 1  Hd  2016-05-29 13:46    0 
1643 0812 3  Lr  2016-05-29 11:41    0 
1644 0806 4  Mn  2016-05-29 06:56    0 
1644 0806 5  Bp  2016-05-29 09:54    1 
1644 0806 5  Bp  2016-05-29 17:43    0 

Ожидаемый результат

oId Number  Id Location  TimeFirst    TimeLast  
1639 0664  1  Hd  2016-05-29 05:48   
1639 0664  2  Kp  2016-05-29 18:46   
1640 0359  1  Hd  2016-05-29 13:12   
1640 0359  1  Hd  2016-05-29 13:42   2016-05-29 13:46  
1643 0812  3  Lr  2016-05-29 11:41   
1644 0806  4  Mn  2016-05-29 06:56   
1644 0806  5  Bp  2016-05-29 09:54   2016-05-29 17:43  
+1

Почему вы отмечаете две версии SQL Server? Кроме того, какова логика, по которой вы ожидаете, что TimeLast будет заполнен? Что делать, если у вас есть строки с 3 x статусом 0 и 3 x статус 1 для тех же 'id' и' name'? Является ли 'Number' функционально зависимым от' id'? – trincot

+0

@ вопрос про вопрос. Я использую Sql Server 12. Внутри указывается, что вы вводите в определенное местоположение или влево. – Doe

+0

Просьба предоставить определение ваших таблиц, первичных ключей, внешних ключей, предпочтительно операторов 'CREATE TABLE'. Я не понимаю, когда вы хотите иметь дату в столбце «Время» и когда вы хотите ее в столбце «Timelast». Пожалуйста, объясните в вопросе. – trincot

ответ

0

Как вы на Sql Server 2012, вы можете сделать это с помощью окна агрегатных функций lag и lead, которые позволяют сравнить данные с данными в предыдущей или следующей записи:

select oId, Number, Id, Location, TimeFirst, 
     CASE WHEN inside = 1 THEN DepartureTime END DepartureTime 
from  ( select zs.oId, o.Number, z.Id, z.Location, zs.TimeFirst, 
        zs.inside, 
        lag(zs.inside) over (partition by o.oId, z.Id 
              order by zs.TimeFirst) as prev_inside, 
        lead(zs.inside) over (partition by o.oId, z.Id 
              order by zs.TimeFirst) as next_inside, 
        lead(zs.TimeFirst) over (partition by o.oId, z.Id 
               order by zs.TimeFirst) as DepartureTime 
      from  zs 
      join  z on zs.Id = z.Id 
      join  o on zs.oId=o.oId 
      where z.GroupId in (1094,1095,1096) 
      and  CONVERT(Date,TimeFirst)='2016/5/29' 
     ) as base 
where (inside = 1 or coalesce(prev_inside,0) = 0) 
order by oId, TimeFirst 

SQL fiddle

0

Это может быть полезно для вас:

select zs.old,o.Number,z.Id,z.Name,zs.Timefirst, (select case when zs.timefirst in (select max(Timefirst) from zs group by zs.old ,zs.id) then zs.timefirst else '' end) as TimeLast from zs join z on zs.Id = z.Id join o on zs.old=o.old order by zs.old,zs.Timefirst 
Смежные вопросы