提取历史记录行的最后状态

时间:2019-05-23 06:49:30

标签: mysql

在MySQL数据库上,我的表tableStatus有76869行。

这些76869行是每个elementCode node的历史记录。

根据历史记录,单个elementCode node可以更改其status并从status Available 变为 UNAVAILABLE 以及相反的方式。

这是一个示例:

mysql> SELECT
    sis,
    element,
    `Code node`,
    MAX(Datetime),
    Status
FROM
    `tableStatus`
GROUP BY
    element,
    Status
ORDER BY
    MAX(Datetime) DESC;
+------+-------------------+---------------+---------------------+------------------+
| sis  | element           | Code node     | MAX(Datetime)       | Status           |
+------+-------------------+---------------+---------------------+------------------+
| 7605 | ZZ190923:TT214364 | 7605-2-190923 | 2019-01-22 09:02:47 | AVAILABLE        |
| 7604 | ZZ190923:ZZ394525 | 7605-2-190923 | 2019-01-22 09:02:43 | AVAILABLE        |
| 7145 | ZZ073097:TT070936 | 7605-2-190923 | 2018-12-19 15:16:23 | UNAVAILABLE      |
| 7144 | ZZ073097:ZZ072998 | 7605-2-190923 | 2018-12-19 15:16:20 | UNAVAILABLE      |
+------+-------------------+---------------+---------------------+------------------+
4 rows in set

仅当每个statuselement的{​​{1}}为不可用时,我才需要提取最后的职位状态。

我尝试使用 WHERE Code node UNAVAILABLE ,但输出错误,因为statusstatus中的最后位置' 7605-2-190923'是 Available ,不应该提取。

Code node

你能帮我吗?

2 个答案:

答案 0 :(得分:1)

SELECT
    *
FROM
    `tableStatus` A
INNER JOIN
    (
    SELECT
        `Code node`, MAX(Datetime) LastDatetimeForNode
    FROM
        tableStatus
    GROUP BY `Code node`
    ) B ON A.`Code node` = B.`Code node` AND A.`Datetime` = B.`LastDatetimeForNode`
WHERE A.`Status` = 'UNAVAILABLE'
;

答案 1 :(得分:1)

尝试一下:

SELECT
    sis,
    element,
    t.`Code node`,
    Max_datetime,
    MAX(DATETIME) AS Mdt,
    STATUS
FROM
    `tableStatus` JOIN
  (SELECT `Code node`, MAX(DATETIME) AS 'Max_datetime'
     FROM `tableStatus`
     GROUP BY `Code node`) t
ON `tableStatus`.`Code node`=t.`Code node`
WHERE
    tableStatus.`Code node` IN ('7605-2-190923')
AND STATUS IN ('UNAVAILABLE')
GROUP BY
    element,
    STATUS
HAVING mdt=Max_datetime
ORDER BY
    MAX(DATETIME) DESC;