如何在一行中显示两个不同的记录?

时间:2016-03-17 11:25:05

标签: mysql sql

我已经搜索了stackoverflow,但是我没有发现任何提及根据不同日期合并两行记录的问题。

我有这张桌子。

ID    Timestamp            State
6      2016-02-03 07:13      End
5      2016-02-02 21:09      Start
4      2016-02-02 9:10       End
3      2016-02-01 21:10      Start
2      2016-02-01 6:30       End
1      2016-01-31 23:40      Start

所以过程' A'从2016-01-31 23:40开始,在2016-02-01 6:30停止,依此类推。我想以这种方式显示它:

Start Time        End Time
2016-01-31 23:40  2016-02-01 6:30
2016-02-01 21:10  2016-02-02 9:10
2016-02-02 21:09  2016-02-03 07:13

StartEnd代码之间还有其他记录。 你能告诉我怎么解决吗?我正在尝试在WAMP服务器上获得解决方案。

2 个答案:

答案 0 :(得分:2)

如果查询较少,那么你的表现会更好......

SELECT x.timestamp start
     , MIN(y.timestamp) end 
  FROM my_table x 
  JOIN my_table y 
    ON y.timestamp > x.timestamp 
   AND y.state = 'end' 
 WHERE x.state = 'start' 
 GROUP 
    BY x.timestamp;

答案 1 :(得分:2)

如果ID没有间隙,您可以在ID< =>上使用自我加入id + 1,但依靠技术ID这样的东西通常是一个坏主意。您可以通过为所有开始和所有结束提供行号并加入这些来做同样的事情。或者在where子句中使用简单的子选择:

select 
  timestamp as start_time,
  (
    select min(timestamp)
    from mytable ends
    where ends.state = 'End'
    and ends.timestamp > starts.timestamp
  ) as end_time
from mytable starts
where state = 'Start'
order by timestamp;