【问题标题】:SQL: Extract most recent timestamp from a dictionary text columnSQL:从字典文本列中提取最近的时间戳
【发布时间】:2020-08-14 04:12:21
【问题描述】:

给定一个具有单列的表,其中每一行是 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

【问题讨论】:

  • 该列的数据类型是什么?
  • @GMB 包含 dict 的字符串表示的列的类型为:varchar

标签: sql json postgresql select jsonb


【解决方案1】:

就您的示例数据中显示的而言,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

Demo on 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 |值 :----------------- | :------ 2018-08-12T21:00:00 | 88888.8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多