【问题标题】:Query last N values of json value in postgresql在postgresql中查询json值的最后N个值
【发布时间】:2020-12-08 04:29:39
【问题描述】:

我在 postgresql 中有这样的 json 文件:

{
    "timestamp":[
        "2020-01-05 01:05:45",
        "2020-01-07 05:58:02",
        "2020-01-05 23:58:51",
        "2020-01-06 04:38:36",
        "2020-01-07 08:55:28",
        "2020-01-06 10:59:32",
        "2020-01-07 16:37:26",
        "2020-01-07 17:12:57",
        "2020-01-06 20:36:14",
        "2020-01-06 10:11:29"
    ],
    "value":[9,66,20,43,59,76,22,10,20,62]
}

我想查询时间戳和值的最后 N 个值。如果 N = 2 我们有:

[("2020-01-06 20:36:14","2020-01-06 10:11:29"),(20,62)]

【问题讨论】:

  • @Nick 感谢编辑

标签: sql arrays json database postgresql


【解决方案1】:

在 Postgres 12 中,您可以为此使用 jsonb_path_query_array()

假设您的 json 有效负载存储在 mytable 的列 js 中,以下查询将为您提供两个数组中每个数组的最后 3 个元素。

select
    t.*,
    jsonb_path_query_array(
        t.js -> 'timestamp', 
        '$[$.size() - 3 to $.size() - 1]'
    ) last_3_timestamps,
    jsonb_path_query_array(
        t.js -> 'value',     
       '$[$.size() - 3 to $.size() - 1]'
    ) last_3_values
from mytable t

JSON 路径表达式 '$[$.size() - 3 to $.size() - 1]' 过滤最后 3 项。 size() 获取数组大小,而数组索引从0 开始,所以$.size() - 1 是数组最后一个元素的索引。如果少于 3 个元素,则返回所有元素。

【讨论】:

  • 非常感谢。你的回答对我很有帮助。 @GMB
  • 我的数据是 json 格式而不是 jsonb 所以下面的查询对我有用:select jsonb_path_query_array((mycolumn -> 'timestamp')::jsonb,'$[$.size() - 3 to $.size() - 1]') last_3_timestamps, jsonb_path_query_array((mycolumn -> 'value')::jsonb,'$[$.size() - 3 to $.size() - 1]') last_3_values from mytable;
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2022-01-03
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
相关资源
最近更新 更多