Select Driver_ID, Registered_Begined, Registered_Ended
From DriverTable
and the output from the above query is:
What I am trying to do is:
To find the Registration gap day when the driver begins registered, ended and begin again
Here is the result set I want when I run the updated query from question # 1.
So, on the # 2 question, I want to combine the same "Registration Gap" and take the Min Date as the Register_Beginned Date and Max Date as the Register_Ended date, in this case is NULL.
How do I update the final query so get below result set:
Basically, if there is a gap between registration begin and end. Drivers may begin register and ended then register again and so on, so we want to know the gap between those dates.
use tempdb
go
drop table DriverTable
go
CREATE TABLE DriverTable
(
Driver_ID VARCHAR(7),
Register_Beginned DATETIME,
Register_Ended DATETIME
)
INSERT INTO DriverTable (Driver_ID,Register_Beginned,Register_Ended)
VALUES ('AM253UT','04/05/2001','11/01/2001'),
('AM253UT','02/05/2002','03/11/2003'),
('AM253UT','05/06/2006','11/04/2006'),
('AM253UT','11/06/2006','06/07/2008'),
('AM253UT','06/09/2008','10/11/2014'),
('AM253UT','10/13/2014',NULL)
GO
select * from DriverTable
go
SQL
;WITH rn_cte
AS (SELECT Row_number()
OVER (
ORDER BY (SELECT NULL) ) AS rn,
driver_id,
register_beginned,
register_ended
FROM drivertable)
SELECT a.*,
Datediff(dd, a.register_ended, b.register_beginned)
FROM rn_cte a
JOIN rn_cte b
ON a.rn + 1 = b.rn
go
;WITH rn_cte
AS (SELECT Row_number()
OVER (
ORDER BY (SELECT NULL) ) AS rn,
driver_id,
register_beginned,
register_ended
FROM drivertable),
cte
AS (SELECT a.driver_id,
Min(a.register_beginned) AS
Register_Beginned
,
Max(a.register_ended) AS
Register_Ended,
Datediff(dd, a.register_ended, b.register_beginned) AS dd
FROM rn_cte a
RIGHT JOIN rn_cte b
ON a.rn + 1 = b.rn
GROUP BY a.driver_id,
Datediff(dd, a.register_ended, b.register_beginned))
SELECT *
FROM cte
WHERE driver_id IS NOT NULL
go
drop table if exists #DriverTable
CREATE TABLE #DriverTable
(
Driver_ID VARCHAR(7),
Register_Beginned DATETIME,
Register_Ended DATETIME
)
INSERT INTO #DriverTable (Driver_ID,Register_Beginned,Register_Ended)
VALUES ('AM253UT','04/05/2001','11/01/2001'),
('AM253UT','02/05/2002','03/11/2003'),
('AM253UT','05/06/2006','11/04/2006'),
('AM253UT','11/06/2006','06/07/2008'),
('AM253UT','06/09/2008','10/11/2014'),
('test','11/06/2006','06/07/2008'),
('test','06/09/2008',null),
('AM253UT','10/13/2014',NULL)
GO
select Driver_ID, Register_Beginned, Register_Ended,NextRegisterBegin,
DateDiff(day, NextRegisterBegin, Register_Ended) RegistrationGap
from (
Select top 100 * ,
lead(Register_Beginned,1,0) over (order by Driver_ID, Register_Beginned) NextRegisterBegin
from #drivertable
order by Driver_ID, Register_Beginned) v
Thank you harishgg1, it is working. How long you have been doing this SQL and what is your suggestion for me to be able to work with trick like in SQL?