2017-10-17 90 views
2

我有一個表中的數據的日期分組:如何退還的連續2行,其中的時間爲15分鐘分開分鐘(時間),通過

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 

我試圖返回分鐘連續2行,其中的時間爲15分鐘間隔(時間),通過日期

例如分組,我的結果應該是這樣的:

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 

這是查詢我有這麼遠,但我需要額外的邏輯來顯示min(Time)o連續F 2行,其中所述時間爲15分鐘間隔,通過

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 

一切工作正常,則日期分組除了當我遇到這樣的數據在我的表

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 

結果返回

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 
+0

示例數據很棒,但這次它太多了。沒有超過需要解決的問題。 – jarlh

回答

1

我不確定你爲什麼使用rn來得到結果,因爲它似乎沒有與日期和時間列相關。如果要獲取時間間隔爲15分鐘的行,最佳選擇是將datetime列合併到一個datetime列中,以便處理完整日期。

另外,我不知道是否date/time的類型date/time的或只是char列,所以我打算把兩個版本:date類型的

date/time列/ time分別

SQL fiddle

型的210

date/time列分別

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)) 

SQL fiddle

char(8)/char(4)在我們使用EXISTS來獲取具有相同的位置和類型,但恰好15的另一行的行兩個版本幾分鐘後。