-
您需要通过删除末尾的逗号来修复JSON的格式
以开头的行
"activityDate"
钥匙
-
转换函数,例如
STR_TO_DATE()
应适用于
衍生
activityDate
列,以便按顺序排列日期(不是
个性方面
)结果。
-
通过put不需要子查询
ROW_NUMBER()
分析
函数旁边
ORDER BY
条款(
具有
下降
秩序
),并添加a
LIMIT 1
条款
在查询结束时
因此,您可以将查询重写为
SELECT t1.hostname,
j.Msg
FROM t1
CROSS JOIN
JSON_TABLE(details, '$[*]'
COLUMNS (
Msg VARCHAR(100) PATH '$.Msg',
activityDate VARCHAR(100) PATH '$.activityDate'
)
) j
ORDER BY ROW_NUMBER()
OVER (
ORDER BY STR_TO_DATE(j.activityDate, '%Y-%m-%d %H:%i:%S') DESC)
LIMIT 1
Demo
更新
:
对于有多个id值的情况,您可以考虑使用
行数()
在子查询中执行函数,并过滤掉主查询中返回等于1的值:
SELECT id, Msg
FROM
(
SELECT t1.*, j.Msg,
ROW_NUMBER()
OVER (PARTITION BY id
ORDER BY STR_TO_DATE(j.activityDate, '%Y-%m-%d %H:%i:%S') DESC) AS rn
FROM t1
CROSS JOIN
JSON_TABLE(details, '$[*]'
COLUMNS (
Msg VARCHAR(100) PATH '$.Msg',
activityDate VARCHAR(100) PATH '$.activityDate'
)
) j
) q
WHERE rn= 1
Demo
另一种方法使用
行数()
功能与
LIMIT
子句包含Correlated Subquery,适用于具有多个
身份证件
值:
SELECT t.id,
( SELECT j.Msg
FROM t1
CROSS JOIN
JSON_TABLE(details, '$[*]'
COLUMNS (
Msg VARCHAR(100) PATH '$.Msg',
activityDate VARCHAR(100) PATH '$.activityDate'
)
) j
WHERE t1.id = t.id
ORDER BY ROW_NUMBER()
OVER (ORDER BY STR_TO_DATE(j.activityDate, '%Y-%m-%d %H:%i:%S') DESC)
LIMIT 1 ) AS Msg
FROM t1 AS t
Demo