簡體   English   中英

通過匹配和不匹配的DateTime進行記錄

[英]Records by matching and non-matching DateTime

請幫助我弄清楚以下邏輯。 當B.DateTime匹配E.DateTime時,則獲取E.Location。 當B.DateTime <> E.DateTime時,則從先前/較早的E.DateTime中獲取E.Location。 請在“(城市A”,“城市B”,“城市C”,“城市E”,“城市F”,“城市G”,“城市X”,“城市Y”)中包括WHERE位置。 我會感激你的 這是sqlfiddle: http ://sqlfiddle.com/#!6/8eb014/1

Base table as B
Id   DateTime
201  2015-05-03 08:01
301  2015-05-03 08:20
401  2015-05-03 08:40

Extract Table as E
Id   DateTime            Location
201  2015-05-03 07:50    City A
201  2015-05-03 08:01    City B
201  2015-05-03 08:50    City C
301  2015-05-03 07:15    City E
301  2015-05-03 08:01    City F
301  2015-05-03 08:20    City G
401  2015-05-03 07:15    City X
401  2015-05-03 08:55    City Y

Desired Result:
Location  Id    DateTime
City B    201   2015-05-03 08:01
City G    301   2015-05-03 08:20
City X    401   2015-05-03 07:15

我在sqlfiddle上嘗試了以下代碼,但執行時遇到問題:

select B.id, coalesce(E.Location,F.Location),coalesce(E.DateTime,F.DateTime)
from Base B
inner join Extract E
on B.id = E.id
and B.DateTime = E.DateTime
and E.Location in ('City A','City B','City C','City E','City F','City G','City X','City Y')
left join Extract F
on B.id = F.id
and F.DateTime < B.DateTime
and F.Location in ('City A','City B','City C','City E','City F','City G','City X','City Y')

當我用實際數據運行此邏輯時,得到以下結果。

Location  Id    DateTime
City B    201   2015-05-03 08:01
City G    301   2015-05-03 08:20

ID 401丟失了。

嘗試這個。 它將按第一個匹配的日期排序,然后按日期排序:

select B.id, ca.dt, ca.location
from B
cross apply(select top 1 location, dt
            from E 
            where B.id = E.id 
            order by case when B.dt = E.dt then 1 else 0 end desc,
                     E.dt)ca

請嘗試以下查詢。 您正在B和E上使用內部聯接,它在datetime字段上過濾掉401,因為e沒有它。

select distinct b.id,coalesce(e.location,a.location) ,coalesce(e.datetime,a.dt)
from base b
left outer join extract e 
on b.id = e.id
and b.datetime = e.datetime
and E.Location in ('City A','City B','City C','City E','City F','City G','City X','City Y')
inner join 
(
select b2.id,f.location,max(f.datetime) as dt from base b2 join extract f on b2.id = f.id and b2.datetime <> f.datetime
where f.datetime < b2.datetime
group by b2.id,f.location 
) a
on b.id = a.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM