我正在MariaDB 10.1.12上工作。像一个完整的外部联接,但只有第一个匹配
首先让我们来看看表 “prod_line_state”:
id | timestamp | state
---------------------------------------
CHxxx | 2000-01-01 00:00:00 | 0
CHxxx | 2016-07-07 16:18:49 | 1
CHxxx | 2016-07-07 16:19:00 | 0
CHyyy | 2000-01-01 00:00:00 | 0
CHyyy | 2016-07-07 16:28:08 | 0
CHyyy | 2016-07-07 16:29:23 | 1
CHyyy | 2016-07-07 16:29:28 | 0
CHyyy | 2016-07-07 16:29:32 | 1
CHyyy | 2016-07-07 16:29:39 | 0
CHyyy | 2016-07-07 17:22:55 | 1
而且我想这一点:
id | StartedAt | StoppedAt
---------------------------------------
CHxxx | 2000-01-01 00:00:00 | 2000-01-01 00:00:00
CHxxx | 2016-07-07 16:18:49 | 2016-07-07 16:19:00
CHyyy | 2000-01-01 00:00:00 | 2000-01-01 00:00:00
CHyyy | 2000-01-01 00:00:00 | 2016-07-07 16:28:08
CHyyy | 2016-07-07 16:29:23 | 2016-07-07 16:29:28
CHyyy | 2016-07-07 16:29:32 | 2016-07-07 16:29:39
CHyyy | 2016-07-07 17:22:55 | 3000-01-01 00:00:00
“2000-01-01 00:00:00” 和“3000-01- 01 00:00:00“是假日期。这意味着,没有开始记录或没有停止记录。
为此,我做了下面的查询,巫婆是丑陋的,但我不知道如何更好地做到这一点:
SELECT id, Timestamp as StartedAt, IFNULL((SELECT Timestamp
FROM prod_line_state
WHERE State = 0 AND started.id = prod_line_state.id AND prod_line_state.Timestamp > started.Timestamp
ORDER BY Timestamp ASC
LIMIT 1), '3000-1-1 00:00:00') as StoppedAt
FROM prod_line_state started
WHERE State <> 0
UNION
SELECT id, IFNULL((SELECT Timestamp
FROM prod_line_state
WHERE State <> 0 AND stopped.id = prod_line_state.id AND prod_line_state.Timestamp < stopped.Timestamp
ORDER BY Timestamp DESC
LIMIT 1), '2000-1-1 00:00:00') as StartedAt, Timestamp as StoppedAt
FROM prod_line_state stopped
WHERE State = 0
ORDER BY id, startedAt, stoppedAt
所以我寻找更好的方式来做到这一点。任何想法?
哪里CHvvv来自于你的样本数据?我不遵循产生所需结果的逻辑。你能解释他们是如何计算的? –
抱歉,CHvvv是CHxxx。我编辑过它。 –