2016-07-07 43 views
0

我正在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 

所以我寻找更好的方式来做到这一点。任何想法?

+0

哪里CHvvv来自于你的样本数据?我不遵循产生所需结果的逻辑。你能解释他们是如何计算的? –

+0

抱歉,CHvvv是CHxxx。我编辑过它。 –

回答

0
SELECT id, 
     IF(state = 0, MAX(timestamp), NULL) AS StartedAt, 
     IF(state = 1, MAX(timestamp), NULL) AS StoppedAt 
    FROM (SELECT 
       @seq := @seq + IF(id != @prev_id OR state = 0, 1, 0) AS seq, 
       id, state, timestamp, 
       @prev_id := id AS junk 
      FROM (SELECT @prev_id := '', @seq := 0) AS init 
      JOIN prod_line_state 
      ORDER BY id, timestamp 
     ) AS a 
    GROUP BY seq 
    ORDER BY seq 

如果不接近,给我你的测试用例CREATE TABLEINSERTs

+0

嗨,我无法执行您的查询,看起来它不是MariaDB兼容。 –

+0

我有一个语法错误。 (我没有检查它是否正常工作。) –

+0

您的查询结果不好: id | StartedAt | StoppedAt --------------------------------------- CHvvv | 2016-07-07 16:18:49 | NULL CHvvv | 2016-07-07 16:19:00 | NULL CHyyy | 2000-01-01 00:00:00 | NULL CHyyy | 2016-07-07 16:29:23 | NULL CHyyy | 2016-07-07 16:29:32 | NULL CHyyy | 2016-07-07 17:22:55 | NULL –

0

您的结果:

id |  StartedAt  | StoppedAt 
--------------------------------------- 
CHxxx | 2016-07-07 16:18:49 | NULL 
CHxxx | 2016-07-07 16:19:00 | NULL 
CHyyy | 2000-01-01 00:00:00 | NULL 
CHyyy | 2016-07-07 16:29:23 | NULL 
CHyyy | 2016-07-07 16:29:32 | NULL 
CHyyy | 2016-07-07 17:22:55 | NULL 

结果我想:

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 
0

对不起,

这里是子查询结果:

seq | prodLine | state |  timestamp  | junk 
----------------------------------------------------- 
    1 | CHxxx | 0 | 2000-01-01 00:00:00 | CHxxx 
    1 | CHxxx | 1 | 2016-07-07 16:18:49 | CHxxx 
    2 | CHxxx | 0 | 2016-07-07 16:19:00 | CHxxx 
    3 | CHyyy | 0 | 2000-01-01 00:00:00 | CHyyy 
    4 | CHyyy | 0 | 2016-07-07 16:28:08 | CHyyy 
    4 | CHyyy | 1 | 2016-07-07 16:29:23 | CHyyy 
    5 | CHyyy | 0 | 2016-07-07 16:29:28 | CHyyy 
    5 | CHyyy | 1 | 2016-07-07 16:29:32 | CHyyy 
    6 | CHyyy | 0 | 2016-07-07 16:29:39 | CHyyy 
    6 | CHyyy | 1 | 2016-07-07 17:22:55 | CHyyy 
相关问题