json_table()
не делает то, что вы думаете здесь: он предназначен для работы с массивом JSON , в то время как ваш столбец содержит JSON объект .
Альтернативный подход - использовать json_table()
с json_keys()
для извлечения ключей объекта в виде строк: затем вы можете извлечь соответствующие значения, ранжировать строки, имеющие одинаковые servername
, и оставить только верхнюю строку для каждой группы :
select servername, state, starttime
from (
select
t.servername,
json_unquote(json_extract(t.status, concat('$.', j.k, '.startTime'))) starttime,
json_unquote(json_extract(t.status, concat('$.', j.k, '.state'))) state,
row_number() over(
partition by t.servername
order by json_unquote(json_extract(t.status, concat('$.', j.k, '.startTime'))) desc
) rn
from mytable t
cross join json_table(
json_keys(t.status),
'$[*]' columns (k varchar(50) path '$')
) j
) t
where rn = 1
Демонстрация на DB Fiddle :
servername | state | starttime
:--------- | :---- | :-----------------------
abc.com | ENDED | 2020-08-05T05:08:36.286Z