简体   繁体   中英

SQL Query - first and last row, when end date is a start date for next row

I have a table with

      MeetPointID   MeetPointName   date      ZoneStartTime         ZoneStopTime                Driver    DriverCode    Car                CarPlate
        12590           123      2018-06-12   2018-06-12 15:18:44   2018-06-12 15:19:24         Nowak Jan   NULL    K1ZORRO PEŻAK EXPERT    K1ZORRO
        12590           123      2018-06-12   2018-06-12 15:19:24   2018-06-12 15:24:45         Nowak Jan   NULL    K1ZORRO PEŻAK EXPERT    K1ZORRO
        12590           123      2018-06-12   2018-06-12 15:24:45   2018-06-12 15:25:05         Nowak Jan   NULL    K1ZORRO PEŻAK EXPERT    K1ZORRO
        260832          345      2018-06-12   2018-06-12 15:17:44   2018-06-12 15:19:24         Nowak Jan   NULL    K1ZORRO PEŻAK EXPERT    K1ZORRO
        260832          345      2018-06-12   2018-06-12 15:19:24   2018-06-12 15:24:45         Nowak Jan   NULL    K1ZORRO PEŻAK EXPERT    K1ZORRO
        260832          345      2018-06-12   2018-06-12 15:24:45   2018-06-12 15:27:05         Nowak Jan   NULL    K1ZORRO PEŻAK EXPERT    K1ZORRO

Table is showing entering and leaving time from some zones. I want to merge all rows, where MeetPointId is the same, and where ZoneStopTime is the same as next row ZoneStartTime. What I want to get is a table like below:

      MeetPointID   MeetPointName   date     ZoneStartTime        ZoneStopTime          Driver     DriverCode   Car                     CarPlate
         12590          123      2018-06-12  2018-06-12 15:18:44  2018-06-12 15:25:05   Nowak Jan  NULL         K1ZORRO PEŻAK EXPERT    K1ZORRO
         260832         345      2018-06-12  2018-06-12 15:17:44  2018-06-12 15:24:45   Nowak Jan   NULL        K1ZORRO PEŻAK EXPERT    K1ZORRO

What I have now is:

SELECT

ID as MeetPointID
,MeetPointName
,CONVERT(date, t.StartTime) as data
,min(t.StartTime) as ZoneStartTime
,max(t.StopTime) as ZoneStopTime
/*,iif(
max(t.NextStartTime) = max(StopTime), max(t.NextStartTime), max(StopTime)
)as ZoneStopTime*/

,t.Driver as Driver
,DriverCode
,t.Car as Car
,CarPlate

from 
 (
  Select 
amp.ID,
rza.StartTime,
rza.StopTime,
rsa.MainActivityID,

iif((rza.StopTime = LAST_VALUE(rza.StartTime) OVER(PARTITION BY rsa.MainActivityID  ORDER BY CONVERT(date, rza.StopTime) asc)),
 LAST_VALUE(rza.StartTime) OVER(PARTITION BY rsa.MainActivityID  ORDER BY CONVERT(date, rza.StopTime) asc),

 rza.StopTime
)as NextStartTime

,ad.DriverLastName + ' ' + ad.DriverFirstName as Driver
,ad.DriverCode
,ac.CarPlate + ' ' + ac.CarBrand + ' ' + ac.CarModel as Car
,ac.CarPlate
,amp.MeetPointName

FROM
RPT_SUB_ACTIVITY rsa
JOIN RPT_ZONE_ACTIVITY rza on rza.SubActivityID= rsa.ID
JOIN RPT_ZoneActivityMeetPoints rzamp on rza.ID = rzamp.ZoneActivityID
JOIN APP_MEET_POINTS amp on rzamp.MeetPointsID=amp.ID
JOIN GPS_DEVICE gd on rsa.DeviceID = gd.DeviceID
JOIN APP_DRIVER ad on gd.DriverID = ad.DriverID
JOIN APP_CAR ac on ac.CarID = gd.CarID

WHERE
rza.DeviceID in (select * from dbo.fnList2Table(@DeviceIDList))
AND CONVERT(date, rza.StartTime) >= @StartDate
AND CONVERT(date, rza.StartTime) <= @StopDate
and rsa.TypeActivity in (1,2)
--and amp.ID = 12590
) t 

GROUP BY
ID
,MainActivityID
,MeetPointName
,CONVERT(date, StartTime)
,t.Driver
,DriverCode
,t.Car
,CarPlate

ORDER BY
ID, 
CONVERT(date, StartTime)
,ZoneStartTime

But this sql query is using ID's, which are not the same for the rows, so I'am able only to merge some of them.

@Thomas Please check data below:

MeetPointID   StartTime               StopTime              MeetPointName   Driver      DriverCode  Car                     CarPlate
12590         2018-06-13 22:23:48     2018-06-13 22:24:29   123             Nowak Jan   NULL        K1ZORRO PEŻAK EXPERT    K1ZORRO
12590         2018-06-13 22:24:29     2018-06-13 22:24:57   123             Nowak Jan   NULL        K1ZORRO PEŻAK EXPERT    K1ZORRO
12590         2018-06-13 22:28:42     2018-06-13 22:30:33   123             Nowak Jan   NULL        K1ZORRO PEŻAK EXPERT    K1ZORRO

And this should give me a result of:

MeetPointID   StartTime               StopTime              MeetPointName   Driver      DriverCode  Car                     CarPlate
12590         2018-06-13 22:23:48     2018-06-13 22:24:57   123             Nowak Jan   NULL        K1ZORRO PEŻAK EXPERT    K1ZORRO
12590         2018-06-13 22:28:42     2018-06-13 22:30:33   123             Nowak Jan   NULL        K1ZORRO PEŻAK EXPERT    K1ZORRO

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM