2016-03-10 118 views
1

這是表格內容。SQL查詢按時間順序排列的事件列表

Id Style BeginDate BeginEvent EndDate EndEvent** 

1 Style-2 1/1/2001 Manufacture 3/1/2001 Colorchange 
1 Style-2 3/1/2001 Colorchange 5/1/2001 StyleChange 
1 Style-3 5/1/2001 StyleChange 10/1/2001 Sold 

需要查詢,可以提供以下的輸出:

Id, Previous_Style, New_Style, Change_Date 

從本質上說,我想搞清楚當樣式變化發生的事基於每一行由事件相關的其他表中的年代事件。

謝謝!

+0

你使用哪個DBMS?有些數據庫支持窗口功能,有些則不支持。另一個事件的結束日期和開始日期之間是否有差距? –

+0

這是SQL Server 2012.日期可能存在差距和重疊,但實際事件是連接的最佳指標。 – everydaylearn

回答

2

只需使用lag()並進行過濾。從我可以告訴:

select id, prevStyle, Style, BeginDate 
from (select t.*, 
      lag(style) over (partition by id order by begindate) as prevStyle 
     from t 
    ) t 
where BeginEvent = 'StyleChange'; 
+0

這工作完美。但是如果我有一種風格和一種潛力而又想要考慮這兩方面呢? – everydaylearn

+0

你可以調用'lag()'兩次。如果這不起作用,請提出另一個問題。 –

1

看起來您可以使用ID和結束/開始日期加入自己。

select t1.id 
, t2.style as previousstyle 
, t1.style as newstyle 
, t1.begindate as changedate 
from mytable t1 
left join mytable t2 on t2.id = t1.id and t2.enddate = t1.begindate 
    and t2.style <> t1.style 
+0

您可能還想在join中包含endevent/beginevent。 – Mike