2016-03-10 85 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