2016-03-17 100 views
0

我已經搜索了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:402016-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服務器上獲得解決方案。

+0

你使用的是MySQL還是Oracle?請適當標記問題。我正在刪除這兩個標籤,因此您可以添加相應的標籤。 –

+1

任何id或序列列? – jarlh

+0

@jarlh是的,每個記錄都有一個id。我認爲這個id是沒用的,因爲每一對'start'和'end'之間都有其他記錄。或者你認爲我仍然應該添加ID列? – Ash

回答

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; 
+0

雖然這可以產生巨大的中間結果。我想從性能的角度來看,應該使用行號技術:數字開始,所有結束,然後匹配行號。 –

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; 
相關問題