2017-08-03 110 views
1

我需要它每改變城市返回最大日期的每一次出現,所以基本上他們花費爲每一位光臨的城市返回最大日期字段

我已經試過SELECT userid, city, Max(date) from table group by userid, city的最後一天,但它將單獨的住宿結合到同一個城市。

樣品臺

userid city  date 
------ --------- -------------- 
Francis Cambridge 06/15/2017 
Francis Cambridge 07/01/2017 
Francis London  07/02/2017 
Francis Cambridge 07/03/2017 
Francis NewYork 07/05/2017 
Francis NewYork 07/20/2017 
Francis NewYork 07/25/2017 
Francis London  07/31/2017 

所需的查詢結果

userid city  date 
------ --------- -------------- 
Francis Cambridge 07/01/2017 
Francis London  07/02/2017 
Francis Cambridge 07/03/2017 
Francis New York 07/25/2017 
Francis London  07/31/2017 
+0

的數據庫您使用的?日期類型的日期列? – GurV

+0

我正在使用Oracle,並且它是日期類型。但我希望能夠獲得一個通用版本,以防萬一我需要在將來使用它來處理不同的場景。但我現在對Oracle感到滿意。 – fcsr

+0

表中是否有主鍵? – GurV

回答

2

使用lag上一行的用戶名和城市比較當前行和使用運行總和來分配基於指定的條件組。那麼你只需要一個group by來獲得最新的日期。

select userid,city,max(date) 
from (select t.*,sum(col) over(order by date) as grp 
     from (select t.*, 
      case when lag(userid) over(order by date)=userid 
      and lag(city) over(order by date)=city 
      then 0 else 1 end as col 
      from tbl t 
      ) t 
    ) t 
group by userid,city,grp 
+0

或使用[Tabibitosan方法](http://rwijk.blogspot.in/2014/01/tabibitosan.html) - 它有一個較少級別的子查詢 – GurV

+0

感謝vkp我會嘗試你的解決方案,並會回覆給你 – fcsr

0

所以,你要撐不存在後續的入住定城市

調用表stay_log:

select userid, city, date from stay_log last_date LEFT JOIN stay_log next_date ON last_date.userid = next_date.userid and last_date.city = next_date.city and DateAdd(last_date, "1", 1) = next_date.date WHERE next_date.userid is null

+0

感謝Rob Conklin,我會嘗試你的解決方案,並會回覆你 – fcsr