SQL: извлечение самой последней отметки времени из текстового столбца словаря. - PullRequest
1 голос
/ 30 апреля 2020

Для таблицы с одним столбцом, где каждая строка является строковым представлением дикта временных меток, созданного программой Python, существует ли способ использовать только SQL для получения только самой последней временной метки и связанной с ней значение?

Пример строки:

{"2018-08-12T00:00:00": 88888.8, "2018-08-12T15:00:00": 88888.8, "2018-08-12T03:00:00": 88888.8, "2018-08-12T12:00:00": 88888.8, "2018-08-12T21:00:00": 88888.8, "2018-08-12T18:00:00": 88888.8, "2018-08-12T06:00:00": 88888.8, "2018-08-12T09:00:00": 88888.8}

Ожидаемый результат, если CSV:

timestamp,value
"2018-08-12T21:00:00",88888.8

1 Ответ

0 голосов
/ 30 апреля 2020

Насколько показано в ваших данных образца, значения dict являются действительными json строками. Я бы предложил преобразовать их в объект jsonb; затем вы можете использовать jsonb_object_keys() для извлечения ключей, их сортировки и получения значения, соответствующего наибольшему ключу:

select z.ts, (t.dict::jsonb) ->> z.ts val
from t
cross join lateral (
    select ts
    from jsonb_object_keys(t.dict::jsonb) x(ts)
    order by ts desc
    limit 1
) z

Демонстрация на DB Fiddle :

with t as (select '{"2018-08-12T00:00:00": 88888.8, "2018-08-12T15:00:00": 88888.8, "2018-08-12T03:00:00": 88888.8, "2018-08-12T12:00:00": 88888.8, "2018-08-12T21:00:00": 88888.8, "2018-08-12T18:00:00": 88888.8, "2018-08-12T06:00:00": 88888.8, "2018-08-12T09:00:00": 88888.8}' dict)
select z.ts, (t.dict::jsonb) ->> z.ts val
from t
cross join lateral (
    select ts
    from jsonb_object_keys(t.dict::jsonb) x(ts)
    order by ts desc
    limit 1
) z
ts                  | val    
:------------------ | :------
2018-08-12T21:00:00 | 88888.8
...