Reputation: 41
I have data in a table:
select SiteName, LName, Loc1, Appt, Date, Time, Dur from appt
SiteName LName Loc1 Appt Date Time Dur RN
Main Office Jones MO Annual 20171018 1330 15 1
Main Office Jones MO Annual 20171018 1345 15 2
Main Office Jones MO Annual 20171018 1530 15 3
Main Office Jones MO Annual 20171018 1545 15 4
Main Office Jones MO Annual 20171024 1045 15 1-----I don't need this row
Main Office Jones MO Annual 20171024 1530 15 2
Main Office Jones MO Annual 20171024 1545 15 3
Main Office Jones MO Annual 20171025 1330 15 1
Main Office Jones MO Annual 20171025 1345 15 2
Main Office Jones MO Annual 20171025 1430 15 3
Main Office Jones MO Annual 20171025 1445 15 4
Main Office Jones MO Annual 20171025 1530 15 5
Main Office Jones MO Annual 20171025 1545 15 6
Main Office Jones MO Annual 20171027 1045 15 1-----I don't need this row
Main Office Jones MO Annual 20171027 1530 15 2
Main Office Jones MO Annual 20171027 1545 15 3
Main Office Jones MO Annual 20171031 1030 15 1
Main Office Jones MO Annual 20171031 1045 15 2
Main Office Jones MO Annual 20171031 1330 15 3
Main Office Jones MO Annual 20171031 1345 15 4
Main Office Jones MO Annual 20171031 1430 15 5
Main Office Jones MO Annual 20171031 1445 15 6
Main Office Jones MO Annual 20171031 1530 15 7
Main Office Jones MO Annual 20171031 1545 15 8
Main Office Jones MO Annual 20171101 1145 15 1
Main Office Jones MO Annual 20171101 1330 15 2
Main Office Jones MO Annual 20171101 1345 15 3
Main Office Jones MO Annual 20171101 1430 15 4
Main Office Jones MO Annual 20171101 1445 15 5
I'm trying to return the min(Time) of 2 consecutive rows where the time is 15 min apart, grouped by the date
For example, my results should look like this:
Results:
SiteName LName Loc1 Appt Date Time Dur
Main Office Jones MO Annual 20171018 1330 15
Main Office Jones MO Annual 20171018 1530 15
Main Office Jones MO Annual 20171024 1530 15
Main Office Jones MO Annual 20171025 1330 15
Main Office Jones MO Annual 20171025 1430 15
Main Office Jones MO Annual 20171025 1530 15
Main Office Jones MO Annual 20171027 1530 15
Main Office Jones MO Annual 20171031 1030 15
Main Office Jones MO Annual 20171031 1330 15
Main Office Jones MO Annual 20171031 1430 15
Main Office Jones MO Annual 20171031 1530 15
Main Office Jones MO Annual 20171101 1330 15
Main Office Jones MO Annual 20171101 1430 15
This is the query that I have so far but I need additional logic to show min(Time) of 2 consecutive rows where the time is 15 min apart, grouped by the date
select t.SiteName, t.LName, t.Loc1, t.Appt, t.Date, min(t.Time) as Time, Dur
from appt t
inner join (select Date,
max(rn) rn_x
from appt
where rn % 2 = 0
group by Date ) x
on t.Date = x.Date
and t.rn <= x.rn_x
group by t.SiteName, t.LName, t.Loc1, t.Appt, t.Date, t.Dur,
case when rn%2 = 0
then rn/2 - 1
else rn/2
end
Everything is working ok, except when I encounter data like this in my table
select SiteName, LName, Loc1, Appt, Date, Time, Dur from appt
SiteName LName Loc1 Appt Date Time Dur
Main Office Jones MO Office Visit 20171108 1300 15
Main Office Jones MO Office Visit 20171108 1315 15
Main Office Jones MO Office Visit 20171108 1330 15
Main Office Jones MO Office Visit 20171108 1345 15
The results are returning
SiteName LName Loc1 Appt Date Time Dur
Main Office Jones MO Office Visit 20171108 1300 15
Main Office Jones MO Office Visit 20171108 1315 15------But I don't need this row
Main Office Jones MO Office Visit 20171108 1330 15
Upvotes: 2
Views: 49
Reputation: 2670
I'm not sure why are you using rn
to get the results since it doesn't seem to be related to the date and time columns. If you want to obtain rows with times 15 minutes apart the best option is combining the date
and time
columns into a single datetime
column so you work with the full dates.
Also, I don't know if date
/time
are of type date
/time
or are just char
columns, so I'm going to put the two versions:
date
/time
columns of type date
/time
respectively
with Appointments_DT as (
select *, cast([date] as datetime)+cast([time] as datetime) as AppDatetime
from Appointments
)
select SiteName, LName, Loc1, Appt, [Date], [Time], Dur
from Appointments_DT as ADT1
where exists (select * from Appointments_DT AS ADT2
where ADT2.SiteName=ADT1.SiteName
and ADT2.LName=ADT1.LName
and ADT2.Loc1=ADT1.Loc1
and ADT2.Appt=ADT1.Appt
and ADT2.AppDatetime=dateadd(minute,15,ADT1.AppDatetime))
date
/time
columns of type char(8)
/char(4)
respectively
with Appointments_DT as (
select *, cast([date]+' '+left([time],2)+':'+right([time],2) as datetime) as AppDatetime
from Appointments
)
select SiteName, LName, Loc1, Appt, [Date], [Time], Dur
from Appointments_DT as ADT1
where exists (select * from Appointments_DT AS ADT2
where ADT2.SiteName=ADT1.SiteName
and ADT2.LName=ADT1.LName
and ADT2.Loc1=ADT1.Loc1
and ADT2.Appt=ADT1.Appt
and ADT2.AppDatetime=dateadd(minute,15,ADT1.AppDatetime))
In both versions we use EXISTS
to get the rows that have another row with the same location and type but exactly 15 minutes later.
Upvotes: 1