Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询按时间顺序排列的事件列表_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

SQL查询按时间顺序排列的事件列表

SQL查询按时间顺序排列的事件列表,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,这是表格内容。每一行通过事件相互关联: 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 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
本质上,我想根据表中按时间顺序排列的事件,找出何时发生了样式更改


谢谢

看起来您可以使用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
选择t1.id
,t2.style与前面的style相同
,t1.style作为新闻样式
,t1.begindate作为变更日期
来自MyTableT1
在t2.id=t1.id和t2.enddate=t1.begindate上左连接mytable t2
和t2.style t1.style
只需使用
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';

您使用哪种数据库管理系统?有些数据库支持窗口函数,有些不支持。另一个事件的结束日期和开始日期之间是否有间隔?这是SQL Server 2012。在日期上可能存在间隔和重叠,但实际事件是连接的最佳指示器。您可能也希望在连接中包含endevent/beginevent。这非常有效。但是,如果我有一个样式和一个子样式,并且想同时考虑这两个呢?您可以调用
lag()
两次。如果这不起作用,问另一个问题。