在MySQL数据库上,我的表tableStatus
有76869行。
这些76869行是每个element
和Code node
的历史记录。
根据历史记录,单个element
和Code 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
仅当每个status
和element
的{{1}}为不可用时,我才需要提取最后的职位状态。
我尝试使用 WHERE Code node
是 UNAVAILABLE ,但输出错误,因为status
在status
中的最后位置' 7605-2-190923'是 Available ,不应该提取。
Code node
你能帮我吗?
答案 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;